Dan*_*ter 3 optimization gcc cpython clang compiler-optimization
正如标题所说,如何制作执行python程序的python3解释器;使用 www.python.org 上提供的普通 CPython 版本可以更快甚至最快;在任何 Linux 发行版中?
有没有办法让它比默认的“--enable-optimizations”编译器标志更快?
使用哪个编译器来实现目标?
有哪些支持性基准来证实编译器选择的断言?
我想我找到了一种方法,但它只是让它比我的基准测试稍微快一些。
我通过执行以下操作来做到这一点:
上面的事情该怎么做,会有什么后果?
首先,结果...
正如他们所说,图片描绘了一千个单词!
越低越好。所以你可以看到大部分胜利都属于红色蟒蛇,而绿色蟒蛇则有一些胜利。
Pyperformance 用于基准测试,重点关注现实世界的基准测试,而不是合成基准测试,并尽可能使用整个应用程序。
https://pyperformance.readthedocs.io/index.html
它是使用 pyperfplot 绘制的。
https://github.com/stefantalpalaru/pyperfplot
这一努力激起了我的兴趣,所以我又做了几个基准测试,花了一整天的时间......

那么以上4点该怎么做,会有什么后果呢?
wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tar.xz
Run Code Online (Sandbox Code Playgroud)
tar -xf ./Python-3.9.6.tar.xz
Run Code Online (Sandbox Code Playgroud)
cd ./Python-3.9.6
Run Code Online (Sandbox Code Playgroud)
对于海湾合作委员会
time CFLAGS="-march=native -O3 -pipe" ./configure --enable-optimizations --with-lto
Run Code Online (Sandbox Code Playgroud)
为铿锵
time CC="clang" CFLAGS="-march=native -O3 -pipe -Wno-unused-value -Wno-empty-body -Qunused-arguments -Wno-parentheses-equality" ./configure --enable-optimizations --with-lto
Run Code Online (Sandbox Code Playgroud)
clang 的额外选项只是遵循 python 开发人员的官方建议... https://devguide.python.org/setup/#clang
nano Makefile
Run Code Online (Sandbox Code Playgroud)
搜索“PGO_PROF_GEN_FLAG”(ctrl+w)并在空格“-fprofile-update=prefer-atomic”后附加(不带引号)。它应该看起来像......
PGO_PROF_GEN_FLAG=-fprofile-generate -fprofile-update=prefer-atomic
Run Code Online (Sandbox Code Playgroud)
PGO_PROF_USE_FLAG=-fprofile-use -fprofile-correction -fprofile-partial-training
Run Code Online (Sandbox Code Playgroud)
请注意 ,这一点仅与 gcc 兼容。在撰写本文时,“-fprofile-partial-training”不适用于clang-12。如果没有此设置,gcc 将“优化大小”不属于分析的代码路径。启用此设置将使 gcc 优化未分析的代码路径,积极“优化速度”,这可以带来更好的性能,但代价是更大的代码大小。
请参阅此处: https: //gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
PROFILE_TASK= -m test --pgo-extended
Run Code Online (Sandbox Code Playgroud)
time make -j$(( $(nproc) + 1 ))
Run Code Online (Sandbox Code Playgroud)
上面命令中的 -j 公式只是计算出您拥有的 cpu 数量,并为构建/编译/链接的多重处理添加 1 以加快速度。
不幸的是,回归测试将按顺序执行,没有简单的方法可以切换到运行测试的并发方式。它将运行 425 个测试来分析所有这些!
在我的 i7-3770 上花了这么长时间......
real 49m26.882s
user 55m1.160s
sys 2m1.106s
Run Code Online (Sandbox Code Playgroud)
但我确实有一些其他程序和应用程序以及一个虚拟机同时运行。
sudo make altinstall
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
使用以下命令配置默认的“python3”
sudo update-alternatives --config python3
Run Code Online (Sandbox Code Playgroud)
这是我的...
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:
Run Code Online (Sandbox Code Playgroud)
最后,需要注意的是“/usr/bin”中的任何 python3 都属于您的 Linux 发行版。尽量不要搞乱它,因为它可能会在以后把事情搞砸。您的所有替代安装都将到达“/usr/local/bin”。
一些结论...
更新: Python 3.10.0 与 ubuntu 20.04 股票 python 3.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 版本,其中一些幅度相当大。