脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 深入剖析PyPy,解锁Python比C还快的秘诀

深入剖析PyPy,解锁Python比C还快的秘诀

2024-01-18 15:53机器学习算法与Python实战 Python

Python 有一个致命的缺点:速度比 C、C ++ 等语言慢很多。那么,构建一个 Python 原型测试想法之后,如何将其转变为快速且高性能的工具?而 PyPy,恰好可以解决这一问题。它能够让 Python 代码运行得比 C 还快。

对于研究人员来说,迅速把想法代码化并查看其是否行得通至关重要。Python 是能够实现这一目标的出色语言,它能够让人们专注于想法本身,而不必过度为代码格式等无聊的事情困扰。

但是,Python 有一个致命的缺点:速度比 C、C ++ 等语言慢很多。那么,构建一个 Python 原型测试想法之后,如何将其转变为快速且高性能的工具?通常来说,人们还要再进行一步工作:将 Python 代码手动转换为 C 语言的代码。但如果 Python 原型本身就可以运行得很快,那么转换代码的时间就可以做一些更有意义的事情。

而 PyPy,恰好可以解决这一问题。它能够让 Python 代码运行得比 C 还快。

import time
from termcolor import colored

start = time.time()
number = 0
for i in range(100000000):
    number += i

print(colored("FINISHED", "green"))
print(f"Ellapsed time: {time.time() - start} s")

为了证明 PyPy 的速度,使用默认的 Python 解释器和 PyPy 运行上述代码,执行一个从整数 0 加到 100,000,000 的循环, 然后打印出运行时间。运行结果如下:

深入剖析PyPy,解锁Python比C还快的秘诀运行时间 Python vs PyPy

这不是学术意义上的评估,但该结果是令人惊叹的。与大约需要 10 秒钟的默认 Python 解释器相比,PyPy 仅用 0.22 秒就完成了执行。而且无需进行任何更改就可以直接将 Python 代码放到 PyPy 上。而同一台计算机上,等效的 C 语言实现需要 0.32 秒,PyPy 甚至击败了最快的 C 语言。

为什么 PyPy 这么快?

尽管代码完全相同,但代码的执行方式却大不相同。PyPy 提升速度的秘诀是「即时编译( just-in-time compilation)」,即 JIT 编译。

提前编译 

C、C ++、Swift、Haskell、Rust 等编程语言通常是提前编译(AOT 编译)的。这意味着用这些语言编写代码之后,编译器会将源代码转换成特定计算机架构可读的机器码。也就是说在执行程序时,执行的并不是原始源代码,而是机器码。

深入剖析PyPy,解锁Python比C还快的秘诀提前编译把源代码转化为机器代码

解释语言 

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

深入剖析PyPy,解锁Python比C还快的秘诀解释器逐行运行程序

即时编译

PyPy 是利用即时编译来执行 Python 代码的。即 PyPy 不同于解释器,它并不会逐行运行代码,而是在执行程序前先将部分代码编译成机器码。

深入剖析PyPy,解锁Python比C还快的秘诀JIT 编译综合了提前编译和解释

如上图所示,而 PyPy 使用的 JIT 编译是解释和提前编译的结合,可以利用提前编译来提高性能,并提高解释型语言的灵活性和跨平台可用性。

原文地址:https://mp.weixin.qq.com/s?__biz=MzA4MjYwMTc5Nw==&mid=2648984699&idx=2&sn=aebb5007a6517b90bd00776187594bd6

延伸 · 阅读

精彩推荐
  • Python关于Python常用函数中NumPy的使用

    关于Python常用函数中NumPy的使用

    这篇文章主要介绍了关于Python常用函数中NumPy的使用,在Python中有很多常用的函数,NumPy就是其中之一,那么NumPy该怎么使用,下面就一起来看看吧...

    Python 学习者8742023-03-30
  • Pythonpython实现堆和索引堆的代码示例

    python实现堆和索引堆的代码示例

    本篇文章主要介绍了python实现堆和索引堆的代码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    黄天浩4512021-01-23
  • Python浅谈编码,解码,乱码的问题

    浅谈编码,解码,乱码的问题

    下面小编就为大家带来一篇浅谈编码,解码,乱码的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    脚本之家3342020-09-16
  • Pythonpython使用OpenCV实现多目标跟踪

    python使用OpenCV实现多目标跟踪

    这篇文章主要介绍了python使用OpenCV实现多目标跟踪,如何在OpenCV中使用MultiTracker类实现多目标跟踪API。在深入了解详细信息之前,请查看下面列出的关于目...

    liferecords10262022-12-12
  • PythonPython 'takes exactly 1 argument (2 given)' Python error

    Python 'takes exactly 1 argument (2 given)' Python error

    这篇文章主要介绍了Python 'takes exactly 1 argument (2 given)' Python error的相关资料,需要的朋友可以参考下...

    Python教程网5422020-09-14
  • PythonPython批量图片加水印只需一行命令!

    Python批量图片加水印只需一行命令!

    现在只要你会使用命令,我们就能教大家怎么使用Python超级简单地为图片添加水印,而且具备以下特点。 ...

    菜鸟学Python8302021-04-24
  • Pythonpython实现简易聊天对话框

    python实现简易聊天对话框

    这篇文章主要为大家详细介绍了python实现简易聊天对话框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    丶蓝色5412022-09-09
  • PythonPython实现KNN邻近算法

    Python实现KNN邻近算法

    这篇文章主要为大家详细介绍了Python实现KNN邻近算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Think-througher12012020-12-30