python pypy nuitka 性能对比
测试的源码
import time
def sum(n):
number = 0
for i in range(n):
number += i
return number
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
def power(n):
for i in range(10**n):
continue
return i+1
print("Test1......")
start = time.time()
print(sum(1000000000))
print(f"Ellapsed time: {time.time() - start} s")
print("Test2......")
start = time.time()
print(fibonacci(40))
print(f"Ellapsed time: {time.time() - start} s")
print("Test3......")
start = time.time()
print(power(9))
print(f"Ellapsed time: {time.time() - start} s")
版本如下:
C:\Users\Administrator>python -V
Python 3.10.11
C:\Users\Administrator>pypy -V
Python 3.10.14 (75b3de9d9035, Apr 21 2024, 13:13:38)
[PyPy 7.3.16 with MSC v.1929 64 bit (AMD64)]
C:\Users\Administrator>pip show nuitka
Name: Nuitka
Version: 2.1.6
Summary: Python compiler with full language support and CPython compatibility
Home-page: https://nuitka.net
Author: Kay Hayen
Author-email: Kay.Hayen@gmail.com
License: Apache License, Version 2.0
Location: c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages
Requires: ordered-set, zstandard
Required-by:
路径设置
C:\Users\Administrator\AppData\Local\Programs\Python\Python310
C:\pypy3.10-v7.3.16-win64
对比输出结果
原生Python
C:\Users\Administrator\Desktop>python 030.py
Test1......
499999999500000000
Ellapsed time: 21.422600746154785 s
Test2......
102334155
Ellapsed time: 14.158296346664429 s
Test3......
1000000000
Ellapsed time: 7.591829538345337 s
pypy
C:\Users\Administrator\Desktop>pypy 030.py
Test1......
499999999500000000
Ellapsed time: 0.48470616340637207 s
Test2......
102334155
Ellapsed time: 1.077671766281128 s
Test3......
1000000000
Ellapsed time: 0.43866920471191406 s
Python编译后
C:\Users\Administrator\Desktop>python -m nuitka --onefile --standalone 030.py
Nuitka-Options: Used command line options: --onefile --standalone 030.py
Nuitka: Starting Python compilation with Nuitka '2.1.6' on Python '3.10' commercial grade 'not installed'.
Nuitka: Completed Python level compilation and optimization.
Nuitka: Generating source code for C backend compiler.
Nuitka: Running data composer tool for optimal constant value handling.
Nuitka: Running C compilation via Scons.
Nuitka-Scons: Backend C compiler: gcc (gcc 13.2.0).
Nuitka-Scons: Backend linking program with 6 files (no progress information available for this stage).
Nuitka-Scons: Compiled 6 C files using ccache.
Nuitka-Scons: Cached C files (using ccache) with result 'cache hit': 2
Nuitka-Scons: Cached C files (using ccache) with result 'cache miss': 4
Nuitka-Postprocessing: Creating single file from dist folder, this may take a while.
Nuitka-Onefile: Running bootstrap binary compilation via Scons.
Nuitka-Scons: Onefile C compiler: gcc (gcc 13.2.0).
Nuitka-Scons: Onefile linking program with 1 files (no progress information available for this stage).
Nuitka-Scons: Compiled 1 C files using ccache.
Nuitka-Scons: Cached C files (using ccache) with result 'cache hit': 1
Nuitka-Onefile: Using compression for onefile payload.
Nuitka-Onefile: Onefile payload compression ratio (32.45%) size 9411184 to 3053514.
Nuitka-Onefile: Keeping onefile build directory '030.onefile-build'.
Nuitka: Keeping dist folder '030.dist' for inspection, no need to use it.
Nuitka: Keeping build directory '030.build'.
Nuitka: Successfully created '030.exe'.
C:\Users\Administrator\Desktop>cd 030.dist
C:\Users\Administrator\Desktop\030.dist>030
Test1......
499999999500000000
Ellapsed time: 11.18766450881958 s
Test2......
102334155
Ellapsed time: 5.842983722686768 s
Test3......
1000000000
Ellapsed time: 5.735060930252075 s
对比
结论
- 提升明显
如果用Python 3.12版本
Test1......
499999999500000000
Ellapsed time: 24.196781396865845 s
Test2......
102334155
Ellapsed time: 9.417750120162964 s
Test3......
1000000000
Ellapsed time: 11.618221759796143 s
建议
-
可见3.12版本对递归有优化,其他看不到差异。
-
因为pypy和nuitka当前主要是支持3.10,因此建议用3.10这个版本,可以进行对比和测试。
numba
如果使用numba
安装包
pip install numba
然后在源码中
from numba import jit
在三个函数前增加
@jit
C:\Users\Administrator\Desktop>python 031.py
Test1......
499999999500000000
Ellapsed time: 0.14100098609924316 s
Test2......
102334155
Ellapsed time: 0.47742629051208496 s
Test3......
1000000000
Ellapsed time: 0.13155913352966309 s