用 PyPy 让你的 Python 代码运行得更快( 三 )


此外 , PyPy将工作拆分为可变数量的部分 , 并运行每个部分 , 直到没有剩余部分为止 。 此方法只在每个次要集合之后添加几毫秒 , 而不像CPython那样一次添加数百毫秒 。
垃圾回收机制非常复杂 , 并且有许多超出本教程范围的内容 。 您可以在文档中找到有关PyPy垃圾回收机制的详细信息 。
PyPy的局限性
PyPy并非万能 , 它不是一个适合您所有任务的工具 。 它甚至可能使应用程序的执行速度比CPython慢得多 。 这就是为什么您必须记住以下局限性 。
它不适用于C扩展
PyPy最适合纯Python应用程序 。 无论何时使用C扩展模块 , 它的运行速度都要比在CPython中慢得多 。 原因是PyPy无法优化C扩展模块 , 因为它们不受完全支持 。 此外 , PyPy必须模拟代码中的引用计数 , 使其更慢 。
在这种情况下 , PyPy团队建议去掉CPython扩展并将其替换为纯Python版本 。 如果不行的话 , 则必须使用CPython 。
尽管如此 , 核心团队正在处理C扩展 。 有些软件包已被移植到PyPy , 并且工作速度也同样快 。
它只适用于长时间运行的程序
想象一下你想去一家离你家很近的商店 。 您既可以直接走路前往 , 也可以开车 。
您的车明显比您的脚快得多 。 但是 , 请考虑需要您完成的步骤:
1.去你的车库 。
2、开车 。
3、给车预热 。
4、开车去商店 。
5、寻找停车位 。
6、在返回途中重复此过程 。
开车需要一系列麻烦的步骤 , 如果你想去的地方就在附近 , 那就不一定值得了 。
现在想想 , 如果你想去50公里外的邻近城市 , 会发生什么?开车去那里肯定是值得的 , 而不是步行去 。
虽然速度上的对比并不像上面的类比那样明显 , 但PyPy和CPython和这个道理一样 。
当使用PyPy运行脚本时 , 它会执行许多操作以使代码运行得更快 。 如果脚本本身很简单 , 则实际脚本运行速度会低于CPython 。 另一方面 , 如果您有一个长时间运行的脚本 , 那么可能会带来显著的性能提升 。
想亲自感受一下的话 , 请在CPython和PyPy中运行以下小脚本:
import timestart_time = time.time()for i in range(100):print(i)end_time = time.time()print(f"It took {end_time-start_time:.10f} seconds to compute")当您使用PyPy运行它时 , 开始时会有一个小延迟 , 而CPython会立即运行它 。 在Mac Book Pro上运行它 , 用CPython需要0.0004873276秒 , 用PyPy需要0.0019447803秒 。
它不执行提前编译
正如您在本教程开头所看到的 , PyPy不是一个完全编译型的Python实现 。 它编译Python代码 , 但不是Python代码的编译器 。 由于Python固有的一些特性 , 导致无法将Python编译为独立的二进制文件并重用它 。
Py Py比完全解释型的语言快 , 但比完全编译的语言(如C)慢 。
总结
PyPy是CPython的一种快速且功能强大的替代方案 。 使用它运行脚本 , 您可以在不更改代码的情况下大大提高速度 。 但它也不是万能的 , 有一些局限性 。
在本教程中 , 您学习了:

  • PyPy是什么?
  • 如何安装PyPy并使用它运行脚本
  • PyPy与CPython在速度方面的比较
  • PyPy的功能及其如何提高程序速
  • 在哪些情况下PyPy会有局限性
如果您的Python脚本需要稍微提高速度 , 欢迎尝试PyPy!