大约十年前,我开发了一个纯 Python ODBC 模块(pypyodbc),我非常好奇这个模块在不同的 Python 实现中的兼容性,包括:CPython 2.X、CPython 3.X、PyPy 甚至是 IronPython。
尽管在上述所有解释器中,纯 Python 模块都可以正常运行,但我对使用它来测试这些 Python 实现的性能很感兴趣,以下是一些测试的数据:
版本 |
Python 3.12b1 |
PyPy |
Python 3.11 |
Nuitka + Python 3.7 |
Python 3.10 |
Python 3.9 |
Python 3.8 |
Python 2.7 |
Python 3.7 |
IronPython |
运行时间 |
41.5 |
42.5 |
43.5 |
43.6 |
46.3 |
48.8 |
49.8 |
52.4 |
73.0 |
188.8 |
结论
Python 3.12 Beta1 > PyPy > Python 3.11 ≈ Nuitka + Python 3.7 > CPython 3.10 > CPython 3.9 ≈ CPython 3.8 > CPython 2.7 > CPython 3.7 > IronPython
-
Python 3.12 b1 似乎是最快的,也是第一个在我的测试中超越 PyPy 的 CPython 版本。
-
CPython 版本逐渐变快,但是,直到在 Python 3.8 发布之前CPython 3.X 一直都比 Python 2.7 更慢。
-
PyPy 开始很慢,但在运行脚本时会不断通过JIT特性加速。但如果脚本运行时间很短的话,它就没有机会赶上。
-
Python 3.7的代码用Nuitka编译后比原本快得多,提升到与 Python 3.11 的速度大致相同!- 这对于那些想要将程序发布为可执行文件而不是源代码的人来说是一个非常好的消息。编译的代码可以在没有安装 Python 的计算机上运行,如果您不希望其他人获得您的源代码。
-
IronPython 在我的情况下比 Python 2.7 慢了约三倍,冷启动时间相当明显(难以忍受)。
考虑到为了兼容性,测试脚本和模块本身都是以 2.X 和 3.X 都能运行的方式编写的,但更加友好于 Python 2.7,如果代码以本地 3.x 语法编写,则 3.x 解释器的性能应该更好。
- 结束 -
另请参阅:
CherryPy 在 Python 2.7 / 3.9 / 3.10 上的性能,通过 Locust 负载测试进行分析!