如何使 Python3 解释器更快或最快?

How to make the Python3 interpreter faster or the fastest possible?

正如标题所说,如何制作执行python程序的python3解释器;使用 www.python.org 提供的香草 CPython 版本更快甚至最快​​;在任何 linux 分布中?

有没有办法让它比默认的“--enable-optimizations”编译器标志更快?

使用哪个编译器来实现目标?

哪些支持性基准可以证实关于编译器选择的断言?

我想我找到了一种方法,但它只比我的基准测试稍微快一点。

我通过做以下事情做到了:

  1. 将 PGO 的分析扩展到所有 425 个回归测试 python3 来源。配置“--启用优化” 只有 运行s 附带的 425 回归测试的一小部分 Python3 来源。
  2. 通过“--with-lto”为 LTO 添加 CFLAGS="-march=native -O3 -pipe" 配置选项
  3. 将“-fprofile-update=prefer-atomic”添加到分析阶段
  4. 将“-fprofile-partial-training”添加到最终反馈定向 优化 (FDO) 阶段。

如何进行以上操作,有什么后果?

首先,结果...

图画千言万语!

  • 红色 python 完成了上面的所有点 1-4。
  • 而绿色python只有2分与库存 “--enable-optimizations” 配置限制 PGO 子集。

越低越好。因此,您可以看到大多数胜利都属于红色 python,有几场胜利属于绿色 python。

Pyperformance 用于基准测试,它侧重于真实世界的基准测试,而不是合成基准测试,尽可能使用整个应用程序。

https://pyperformance.readthedocs.io/index.html

它是使用 pyperfplot 绘制的。

https://github.com/stefantalpalaru/pyperfplot

这项努力让我胃口大开,所以我又做了几个基准测试,花了一整天的时间......

  • 红色和黄色 pythons 与来自的红色和绿色相同 上一张图。
  • Green python 是 Python3.9 来自 Ubuntu 他们编译的仓库 使用 gcc9.3.
  • 浅蓝色 python 是 Clang12 上面第 2 点和股票 “--enable-optimizations” 配置限制 PGO 子集。它是基准测试中最差 的表现! 真的很令人惊讶,我开始这项努力时认为 Clang-12 会 赢得所有最近的出版物和广告 Linux 现在完全支持 LTO,Clang-12 占据第一位 在过去几年的许多 Phoronix 基准测试文章中获胜 个月。
  • 深蓝色是默认值 Ubuntu Python3.8 来自 存储库。添加此处只是为了显示是否有进展 3.8 到 3.9 并与我的自定义版本进行比较。

那么以上4点怎么做,后果是什么?

  1. 得到你要构建的python3版本,我得到的是3.9.6...
wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tar.xz
  1. 解压...
tar -xf ./Python-3.9.6.tar.xz
  1. 进入目录进行配置
cd ./Python-3.9.6

对于 gcc


time CFLAGS="-march=native -O3 -pipe" ./configure --enable-optimizations --with-lto

叮当声

time CC="clang" CFLAGS="-march=native -O3 -pipe -Wno-unused-value -Wno-empty-body -Qunused-arguments -Wno-parentheses-equality" ./configure --enable-optimizations --with-lto

clang 的额外选项只是遵循 python 开发人员的官方建议... https://devguide.python.org/setup/#clang

  1. 此时您将传统开始building/compiling。但是,我们希望在分析和最终发布构建期间使用额外选项进一步自定义构建方式。
nano Makefile

搜索“PGO_PROF_GEN_FLAG”(ctrl+w) 并在不带引号的 space "-fprofile-update=prefer-atomic" 之后附加。它应该看起来像...

PGO_PROF_GEN_FLAG=-fprofile-generate -fprofile-update=prefer-atomic
  1. 下面的下一行应该是“PGO_PROF_USE_FLAG”;它会影响最终版本 build/compile 在 space 之后附加“-fprofile-partial-training”,不带引号。它应该看起来像...
PGO_PROF_USE_FLAG=-fprofile-use -fprofile-correction -fprofile-partial-training

注意 这点只兼容gcc。在撰写本文时,“-fprofile-partial-training” 可用于 clang-12。如果没有此设置,gcc 将 'optimise for size' 代码路径不是分析的一部分。启用此设置将使 gcc 优化未分析的代码路径,'optimised for speed' 积极地实现更好的性能,但以更大的代码大小为代价。
看这里:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

  1. 最后,我们将回归测试列表扩展到 运行,从股票子集到完整测试集。 仍在“nano Makefile”中搜索“PROFILE_TASK= -m test --pgo” 并将其替换为:
PROFILE_TASK=   -m test --pgo-extended
  1. 现在您可以开始构建了。但是请注意,为分析启用全套测试将大大增加构建Python3 所需的时间
time make -j$(( $(nproc) + 1 ))

上面命令中的 -j 公式只是计算出您拥有的 cpu 数量,并为 build/compile/链接的多处理添加 1 以加快速度。

不幸的是,虽然回归测试将按顺序执行,但没有简单的方法可以切换到 运行 测试的并发方式。 它将 运行 425 个测试分析所有这些测试!

在我的 i7-3770 上花了这么长时间...

real    49m26.882s
user    55m1.160s
sys 2m1.106s

但我确实同时有一些其他程序和应用程序以及 VM 运行ning。

  1. 一旦完成,“altinstall”这样你就不会弄乱你的发行版附带的默认 python3,这可能会导致问题。
sudo make altinstall
  1. 如果您有多个自定义构建的 python 版本,请使用 update-alternatives 来管理它们。
sudo update-alternatives --verbose --install /usr/local/bin/python3 python3 /usr/local/bin/python3.7 374 --slave /usr/local/bin/python3-config python3-config /usr/local/bin/python3.7-config
sudo update-alternatives --verbose --install /usr/local/bin/python3 python3 /usr/local/bin/python3.8 382 --slave /usr/local/bin/python3-config python3-config /usr/local/bin/python3.8-config
sudo update-alternatives --verbose --install /usr/local/bin/python3 python3 /usr/local/bin/python3.9 396 --slave /usr/local/bin/python3-config python3-config /usr/local/bin/python3.9-config

使用以下命令配置默认的“python3”

sudo update-alternatives --config python3

这是我的...

There are 4 choices for the alternative python3 (providing /usr/local/bin/python3).

  Selection    Path                      Priority   Status
------------------------------------------------------------
* 0            /usr/local/bin/python3.9   396       auto mode
  1            /usr/bin/pypy3             369       manual mode
  2            /usr/local/bin/python3.7   374       manual mode
  3            /usr/local/bin/python3.8   382       manual mode
  4            /usr/local/bin/python3.9   396       manual mode

Press <enter> to keep the current choice[*], or type selection number:

最后,需要注意的是“/usr/bin”中的任何 python3 都属于您的 linux 发行版。尽量不要弄乱它,因为它以后可能会把事情搞砸。您所有的替代安装都将达到“/usr/local/bin”。

一些结论...

  • Clang,一个很棒的编译器和项目,不适合 python3,至少在我的设置中是这样。也许如果他们的开发者正在阅读这篇文章,他们可以做点什么。
  • GCC 规则 Python3,我没有 Intel 的编译器(ICC?)所以不知道,但我听说用于构建时更好 python3.
  • 上述和概述的调整使我的默认值 python3 总体上更快更敏捷,但是构建它花了很多时间!在我看来是值得的。

更新: Python 3.10.0 对比 ubuntu20.04现货python3.8.10

Python 3.10.0,具有完整 PGO、部分训练、Prefer-atomic、march=native (zen3 R7-5800X)、O3 优化
明确获胜 --> 33
Python 3.8.10 Ubuntu 来自回购的库存
明确获胜 --> 22

然而,从图表中可以看出,从 Ubuntu 回购中 3.10 输给了 3.8.10 股票,其中一些幅度相当大。