由于生产部署的问题,需要把用python写的深度学习代码编译为可被调用的文件。上网搜索了下,暂时了解到win10下pyd文件比较流行。下面是直接引用某位博主的结论,个人感觉总结的很好。其中Cython库将已有的Python代码转化为C语言的代码,并作为Python的built-in模块扩展。
Python的文件类型介绍:
.py python的源代码文件
.pyc Python源代码import后,编译生成的字节码
.pyo Python源代码编译优化生成的字节码。pyo比pyc并没有优化多少,只是去掉了断言
.pyd Python的动态链接库(Windows平台)
.py, .pyc, .pyo 运行速度几乎无差别,只是pyc, pyo文件加载的速度更快,不能用文本编辑器查看内容,反编译不太容易
一、系统环境
win10 64位+anaconda的python环境(此处对应envs为tf_2c)+pycharm
二、利用cython创建pyd文件
先安装cython,如果在线安装不了,在https://www.lfd.uci.edu/~gohlke/pythonlibs/下载后本地安装即可。
1.编写一个测试代码文件utils.py放在。。。/pyd_test这个project中
class utils:def fun_Hello(self, s):return s
2.在pyd_test这个project中创建一个setup.py文件
from setuptools import setup
from Cython.Build import cythonizesetup(name='test',ext_modules=cythonize('utils.py'),
)
3.在pycharm命令行调用
进入tf_2c这个虚拟环境中(必须进入该环境中,不然无法调用相应的库)
在terminal中回到当前的project路径,输入以下cmd命令:
python setup.py build_ext --inplace
编译成功后可以看到,project中会出现对应的.c和.pyd文件,如下图所示:
备注:在anaconda prompt中打开对应envs和路径,输入同样的cmd命令亦可实现。
三、测试
在对应的project中创建一个test.py文件,输入以下代码,编译
from utils import utilsif __name__ == '__main__':obj1 = utils()print(obj1.fun_Hello("pyd测试"))
若出现对应字符就为编译正确如下图所示:
注意:
terminal一定也要进入对应的envs,不然无法调用cython。由于之前一直使用anaconda中的spyder作为IDE,没用过pycharm,在此处被坑了一个上午。望后来者引以为戒!
参考文献:
https://blog.csdn.net/feijiges/article/details/77932382