最近在学习openCV发现,想查看源码时,发现程序是通过pyd格式的文件编译过的,于是去网上了解一下,pyd文件如何生成以及其作用。
作用有2方面:
1.安全性更高:通过pyd生成的文件,已变成了dll文件,无法查看源码,只能通过反汇编以后才能查看;
2.编译成pyd后,性能会有提升---(网上有的人说可以N倍提升),本人测试的代码提升约1倍,最后会有详细说明。
打包的过程:
1.安装打包的模块 pip install Cython
2.将要打包的脚本,放在非中文路径下,在路径下新增一个setup.py文件;
代打包的代码:
# -*- coding:utf-8 -*-
# @Time :2020/4/17
import time
def sum_int():
start_time = time.time()
a = (x for x in range(4*10 ** 8))
sum_int = 0
for i in a:
sum_int += i
print(sum_int)
print(f'cost_time:{time.time() - start_time}')
if __name__ == "__main__":
sum_int()
setup.py文件内容
# -*- coding:utf-8 -*-
# @Time :2020/4/20
from distutils.core import setup
from Cython.Build import cythonize
setup(
name='tmp_debug',
ext_modules=cythonize("tmp_debug.py"),
)
在命令行执行
python setup.py build_ext

在当前路径下会生成一个build文件

路径目录有点深,build后面会将整个目录结构再创建一遍(暂时没有去研究去掉的方法),生成的pyd文件,以脚本名(tmp_debug.*)开头,不可修改这个pyd文件的名称,否则无法正常使用
4.调用pyd文件:
将pyd文件当成是一个普通模块使用,通过import+模块名 调用
本例中的调用方法:

性能对比:
直接运行的用时:

通过pyd调用的用时:

通过pypy3调用tmp_debug.py文件的用时

结论:
对于纯计算代码,打包成pyd的性能与用pypy3调用近似,能提高约一倍的性能。
网友评论