在前幾章,進行了python幾種加速的測試。本次進行性能的測試。
測試代碼
import timeit
import matx
from python_cython.cython_test import count as cython_count
from python_extern.Extest import count as extern_count
from ctypes import *
def fib(n: int) -> int:
ret :int = 0
for x in range(n + 1):
ret += 1
return ret
def main():
fib_script = matx.script(fib)
ctype_handel = cdll.LoadLibrary("./python_ctypes/count.so")
tmp = c_int(1000000)
print('Matx execution time: %.9fs' % timeit.timeit(lambda: fib_script(1000000), number=10)) # 0.03s
print('cython execution time: %.9fs' % timeit.timeit(lambda: cython_count(1000000), number=10)) # 0.03s
print('extern execution time: %.9fs' % timeit.timeit(lambda: extern_count(1000000), number=10)) # 0.03s
print('ctype execution time: %.9fs' % timeit.timeit(lambda: ctype_handel.count(tmp), number=10)) # 0.03s
#print(fib_script(1000000))
#print(cython_count(1000000))
#print(extern_count(1000000))
#print(ctype_handel.count(tmp))
if __name__ == '__main__':
main()
結果如下:
python3 test.py
Matx execution time: 0.000057373s
cython execution time: 0.000023637s
extern execution time: 0.004334424s
ctype execution time: 0.000057794s
擴展和ctype使用的同樣的O2級別優化。但是性能差距超乎意料,反復測試沒有找到原因。
測試目錄如下
tree ./
./
├── python_ctypes
│ ├── 1.py
│ ├── count.cc
│ └── count.so
├── python_cython
│ ├── 1.py
│ ├── cython_test.c
│ ├── cython_test.cpython-36m-x86_64-linux-gnu.so
│ ├── cython_test.html
│ └── cython_test.pyx
├── python_extern
│ ├── 1.py
│ ├── build
│ │ ├── lib.linux-x86_64-3.6
│ │ └── temp.linux-x86_64-3.6
│ │ └── my_extend.o
│ ├── Extest.cpython-36m-x86_64-linux-gnu.so
│ ├── my_extend.c
│ └── setup.py
└── test.py
6 directories, 14 files