PyPy 通过采用即时编译技术,能够显著提升 Python 代码的执行效率。

news2024/9/23 21:28:49

🍉 CSDN 叶庭云https://yetingyun.blog.csdn.net/


提升 Python 代码性能至接近 C 语言速度,无需修改源代码。遵循 Python 之父吉多・范罗苏姆的建议:“如果你想让你的代码神奇地运行得更快,你应该试试用 PyPy。

YouTube 视频链接:https://www.youtube.com/watch?v=2wDvzy6Hgxg&t=1012s

A high-speed rocket soaring through the sky, leaving a trail of flames behind, as if propelled by the power of Just-In-Time Compilation. --version 6 --quality 1 --chaos 0 --stylize 100 --aspect 16:9

研究人员需要快速编写代码来验证想法的可行性,这对于他们的工作至关重要。Python 是一个理想的选择,它能帮助人们专注于想法本身,而无需过多关注代码格式等琐碎事务。然而,Python 的一个主要缺点是其运行速度相较于 C 或 C++ 等编译型语言明显较慢

那么,当通过构建 Python 原型验证了想法后,如何将其转化为一个快速且高效的工具呢?通常情况下,人们需要进行额外的步骤,即手动将 Python 代码转换为 C 语言代码。但如果 Python 原型本身就能实现快速运行,那么转换代码的时间便可用于更具价值的工作。

PyPy 恰好能够解决这一问题,它能够显著提升 Python 代码的运行速度,甚至可以与 C 语言相媲美。为了验证 PyPy 的性能优势,我们进行了以下实验:分别使用默认的 Python 解释器和 PyPy 来运行一段代码,该代码执行一个从整数 0 加到 100,000,000 的 for 循环,并打印出运行时间。以下是实验结果:

# 导入了 Python 的 time 模块。time 模块提供了各种与时间相关的函数,可以用来测量时间、处理日期时间等。
import time
# termcolor 是一个第三方库,用于在终端输出彩色文本。colored 函数可以根据指定的颜色来格式化文本。
from termcolor import colored

# 调用了 time 模块中的 time() 函数,并将返回值(当前时间的时间戳,单位为秒)赋值给变量 start。这里记录下开始计算之前的时间点,以便后续计算总耗时。
start = time.time()
# 初始化变量 number 为 0。这个变量将用来累加从 0 到 99,999,999 的所有整数。
number = 0
for i in range(100000000):
	# 在循环体内,每次循环都将变量 i 的值累加到变量 number 上。这样,在循环结束时,number 将包含从 0 到 99,999,999 所有整数的和。
    number += i

print(colored("FINISHED", "green"))
# 再次调用 time.time() 获取当前时间戳,并与之前记录的开始时间戳(存储在变量 start 中)相减,得到执行计算所花费的总时间(单位为秒)。然后,使用 f-string 格式化字符串,将计算出的耗时插入到字符串中并打印出来。这样用户就可以看到程序执行所需的时间。
print(f"Ellapsed time: {time.time() - start} s")

在这里插入图片描述

这不是学术评估,但结果令人惊叹。与默认的 Python 解释器(大约需要 10 秒)相比,PyPy 仅用 0.22 秒就完成了执行。更令人惊讶的是,无需任何修改,Python 代码即可直接在 PyPy 上运行。而在同一台计算机上,等效的 C 语言实现需要 0.32 秒。PyPy 甚至超过了最快的 C 语言实现。

为什么 PyPy 这么快?

尽管代码看起来完全相同,但其执行方式却大相径庭。PyPy 提升执行速度的关键在于采用 “即时编译”(Just-In-Time Compilation),也就是 JIT 编译技术

C、C++、Swift、Haskell、Rust 等编程语言通常采用提前编译(AOT 编译)的方式。这意味着,使用这些语言编写的代码,在程序运行之前,编译器会将其源代码转换为特定计算机架构可执行的机器码。因此,当程序执行时,实际运行的是机器码,而非原始的源代码。

在这里插入图片描述

不同于 C 语言等上述语言,Python、JavaScript、PHP 等语言采用的是另一种方法 —— 解释器。与将源代码转换为机器码不同,解释过程中源代码保持不变。每次运行程序时,解释器都会逐行查看代码并执行。例如,每个 Web 浏览器都内置了 JavaScript 解释器。

在这里插入图片描述

PyPy 利用即时编译技术来执行 Python 代码,与传统解释器不同,它不会逐行运行代码,而是在程序执行前先将部分代码编译成机器码。即时编译结合了提前编译和解释的优点。如图所示,PyPy 采用的即时编译融合了这两种方法,通过提前编译提升性能,同时保持解释型语言的灵活性和跨平台可用性

在这里插入图片描述

AOT 优点:

  1. 在程序运行前进行编译,可以避免运行时的编译性能消耗和内存消耗。

  2. 程序在运行初期即可达到最高性能。

  3. 显著加快程序启动速度。

AOT 缺点:

  1. 程序运行前的编译增加了程序安装的时间。无运行时性能加成,不能根据程序运行情况做进一步的优化。

  2. 提前编译的内容保存会占用更多的外部存储空间。

JIT 优点:

  1. 在程序运行时,根据算法计算出热点代码,然后进行 JIT 实时编译,这种方式吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等。

  2. 可以根据当前程序的运行情况生成最优的机器指令序列,从而提高程序的执行效率。

  3. 当程序需要支持动态链接时,JIT 是一个优先的选择。

  4. JIT 可以根据进程中内存的实际情况调整代码,从而更充分地利用内存资源。

JIT 缺点:

  1. 编译过程会占用运行时资源,这可能导致进程卡顿,影响用户体验

  2. 相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制。

  3. 编译时间需要占用运行时间,并且某些代码的编译优化可能无法实现,因此我们需要考虑程序流畅性和编译时间的问题。

  4. 在编译准备和识别频繁使用的方法时,需要消耗一定的时间,这使得初始编译可能无法达到最高性能。因此,JIT 需要在运行时不断优化代码,以提高程序的执行效率。

PyPy 在我们的程序已经很快或者大部分运行时间都用于调用非 Python 库时,效果较差。然而,如果我们有一个运行缓慢的程序,其中大部分时间都花在执行 Python 代码和密集的计算上,PyPy 可以发挥奇效。

总结:编译型编程语言会将源代码提前转化为机器代码,而解释型编程语言则由解释器逐行运行。即时编译技术结合了提前编译和解释的优点,实现边运行边编译。JIT 与 AOT 的主要区别在于编译时间:JIT 在运行时编译,而 AOT 则在程序运行前进行编译。PyPy 采用即时编译技术,显著提高了 Python 代码的运行速度。即时编译不仅提升了程序执行效率,还保持了解释型语言的灵活性和跨平台可用性。


📚️ 相关链接:

  • TDS - Run Your Python Code as Fast as C

  • AOT、JIT的区别,各自的优缺点,混合编译

  • 解释执行?编译执行?即时编译?轻松让你分清前期编译与后期编译

  • Taichi 是一门开源的、嵌入在 Python 中的并行编程语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二维前缀和与二维差分的表示

前缀和&#xff1a; 上述图片是求范围内的总和的图和公式 上述图片是初始化前缀和数组的图和公式 差分&#xff1a; 上图是差分公式 #include<iostream> #include<climits> #include<algorithm> #include<cstring> #include<cstdio> #include&l…

基于视图能力的县域治理视频基座数字化、智慧化解决方案

一、方案背景 县域治理方案是我国地方治理体系的重要组成部分&#xff0c;对于促进县域经济社会发展、维护社会稳定、推进全面深化改革具有重要意义。随着科技的不断进步&#xff0c;视频监管已经成为了现代社会治理的重要手段之一。县域治理视频监管方案是通过视频监控、数据…

SpringBoot国际化配置流程(超详细)

前言 最新第一次在做SpringBoot的国际化&#xff0c;网上搜了很多相关的资料&#xff0c;都是一些简单的使用例子&#xff0c;达不到在实际项目中使用的要求&#xff0c;因此本次将结合查询的资料以及自己的实践整理出SpringBoot配置国际化的流程。 SpringBoot国际化 "i…

关于svn安装报错2503问题的解决方法

问题&#xff1a; SVN在安装时&#xff0c;一直报错&#xff0c;安装失败 The installer has encountered an unexpected error installing this package.The error code is 2503 权限问题&#xff0c;右键以管理员权限运行。如果你也是像我一样&#xff0c;右键没有以管理员…

springboot 使用@profiles.active@多配置文件切换

项目配置文件结构&#xff1a; 主配置文件内容&#xff1a; pom配置文件&#xff1a; <profiles><profile><id>dev</id><properties><profiles.active>dev</profiles.active></properties></profile><profile>…

43 带 fixed 列的 el-table 不兼容于 sortablejs

前言 这是一个基于 sortablejs 来实现的 el-table 的拖拽功能的基础实现 然后 这个过程中遇到的一个比较特殊的问题是, 关于 el-table-column 的 fixed 的属性, 对于 sortablejs 这边来定位目标选择列 影响的一个问题 在基础的用例中, 使用 “.el-table__body-wrapper tbo…

数组的常见算法

数组的常见算法 数值型数组特征值统计 这里的特征值涉及到&#xff1a;平均值、最大值、最小值、总和等 举例1&#xff1a;数组统计&#xff1a;求总和、均值 public class TestArrayElementSum {public static void main(String[] args) {int[] arr {4,5,6,1,9};//求总和、…

污水处理迈入3D可视化新时代:智慧环保触手可及

在科技日新月异的今天&#xff0c;环保事业也迎来了前所未有的发展机遇。污水处理作为环保领域的重要组成部分&#xff0c;其技术的革新与进步&#xff0c;对于保护水资源、维护生态平衡具有重要意义。 传统的污水处理机组往往存在着操作复杂、监控困难等问题&#xff0c;使得污…

2024年【熔化焊接与热切割】报名考试及熔化焊接与热切割模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新熔化焊接与热切割模拟试题题目及答案&#xff01;多做几遍&#xff0c;其实通过熔化焊接与热切割作业考试题库很简单。 1、【单选题】…

ORA-04031 错误分析及处理方法

一、问题描述 使用普通用户登录数据库报ORA-04031错误 $ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Mon Mar 25 09:14:59 2024Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Releas…

学点儿Java_Day12_IO流

1 IO介绍以及分类 IO: Input Output 流是一组有顺序的&#xff0c;有起点和终点的字节集合&#xff0c;是对数据传输的总称或抽象。即数据在两设备间的传输称为流&#xff0c;流的本质是数据传输&#xff0c;根据数据传输特性将流抽象为各种类&#xff0c;方便更直观的进行数据…

详细分析Linux中的core dump异常(附 Demo排查)

目录 1. 基本知识2. 进阶知识3. Demo4. 彩蛋 1. 基本知识 Core dump 是指在程序异常终止时&#xff0c;操作系统将程序的内存映像保存到磁盘上的一种机制。 在 Linux 系统中&#xff0c;core dump 提供了一种调试程序错误的重要方式&#xff0c;它记录了程序在崩溃时的内存状态…

文献学习(自备)

收官大作&#xff0c;多组学融合的新套路发NC&#xff01;&#xff01; - 知乎 (zhihu.com) Hofbauer cell function in the term placenta associates with adult cardiovascular and depressive outcomes | Nature Communications 病理性胎盘炎症会增加几种成人疾病的风险&a…

CAD自动轻量化,工业仿真动画快速制作

随着现代工业的蓬勃发展&#xff0c;制造业企业在产品宣传展示、工作流程讲解、机械维修维护等方面对展示形式提出了更高的要求。工业动画以其直观、生动的特点&#xff0c;能够深入剖析产品的结构、工作原理和操作流程&#xff0c;为企业带来了全新的宣传展示方式。 但是由于…

Obsidian插件-高亮块(Admonition)

在插件市场里面搜索Admonition并安装插件&#xff0c;就可以使用高亮块了。 添加高亮块 用法稍微有一些不同。按照下面的格式&#xff0c;输入Markdown就可以创建一个高亮块。 内容内容内容输入*ad-*会出现相应的类型可以选择

【QGIS从shp文件中筛选目标区域导出为shp】

文章目录 1、写在前面2、QGIS将shp文件中目标区域输出为shp2.1、手动点选2.2、高级过滤 3、上述shp完成后&#xff0c;配合python的shp文件&#xff0c;即可凸显研究区域了 1、写在前面 利用shp文件制作研究区域mask&#xff0c;Matlab版本&#xff0c;请点击 Matlab利用shp文…

超分之SwinIR官方代码解读

文章目录 一、解读SwinIR模型文件&#xff1a;network_swinir.py1. 带有相对为位置偏置的(W-MSA)2. STL(Swin Transformer)3. RSTB&#xff08;Residual Swin Transformer Block&#xff09;4. SwinIR&#xff08;主框架网络&#xff09; 二、解读SwinIR测试主文件&#xff1a;…

企业员工培训考试系统开发方案

一、引言 在当今知识经济时代&#xff0c;企业对员工的综合素质和专业技能有着越来越高的要求。为了适应这一趋势&#xff0c;构建一个全面而高效的企业员工培训考试系统变得尤为重要。该系统旨在通过提供多样化的培训课程和全面的考核机制&#xff0c;促进员工持续学习和能力…

结构体,联合体,枚举( 1 )

目录 前言 1.结构体 1.1结构体的声明 1.2结构体变量的创建和初始化 1.3结构体成员的访问字符 1.4结构体的内存大小 1.4.1对齐规则 1.5结构体传参 前言 在编程的世界里&#xff0c;数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的…

手写SpringBoot(二)之动态切换Servlet容器

系列文章目录 手写SpringBoot&#xff08;一&#xff09;之简易版SpringBoot 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 手写SpringBoot&#xff08;二&#xff09;之动态切换Servlet容器 文章目录 系列文章目录手写SpringBoot&#xff08;二&#xff…