利用Cython发布python项目

最近有个python项目要发布,遇到了两个问题,一是项目在windows下运行有点慢,二是python都是脚本直接运行,没法保护代码安全。查了一下,有人说可以利用Cython,把python代码编译成为C++来调用。即能提高运行性能,又能实现对代码加密。我尝试做了一遍,果然成功的解决了上面两个问题,所以把过程记录下来。我是在windows 11的环境下操作的。
1、先安装Cython。直接执行命令pip install Cython就可以了。我安装的是0.29.20版本;
2、然后安装VS,可以直接去官网下载。我是从“软件管家”下载的2019版本,安装的时候只需要安装“C++生成工具”(注意:不同版本这个名字不太一样,只要包含后面两项就可以)下面的“MSVCv142 - VS2019 C++ x64/x86生成工具(v14...”和“Windows 10 SDK(10.0.17763.0)”这两项就行了;
3、新建一个目录,要处理的py文件放在里面。我这里创建了一个目录叫“TestPath”,然后放进去了一个我的python文件,名字叫做Demp.py。下面就是py文件的全部内容:
 

def Doing(content):
    ConArr = content.split(',')
    for c in ConArr:
        print(c)

if __name__ == "__main__":
    Doing('A,B,C,A,A,A')

执行之后效果如下:
 

A
B
C
A
A
A

4、接下来在新创建的目录下新建一个pyx文件,把Demo.py文件里面的方法放进去。我这里创建的pyx文件名是fib.pyx,下面是pyx文件的全部内容:
 

def Doing(content):
    ConArr = content.split(',')
    for c in ConArr:
        print(c)

5、然后再创建一个设置用的py文件。我这里创建的设置文件是fib_setup.py,下面是设置文件的全部内容:
 

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
 
setup(
    cmdclass={'build_ext':build_ext},
    ext_modules=[Extension('myfib', ['fib.pyx'])]
    
)

其中fib.pyx就是第4步创建的pyx文件,而'myfib'就是咱们要生成的C++文件名,这个文件名要记住,后面咱们引用和调用的时候要用到;
6、到这里准备工作已经做完了,接下来要生成C++文件了。从cmd命令行进入到咱们在第3步创建的“TestPath”目录下,执行下面命令:
 

python fib_setup.py build_ext --inplace

如果执行结果显示“已完成代码的生成”,就说明执行成功了;
7、最后新写个py程序,调用新生成的C++文件就可以了。我这里创建了一个Test.py,内容如下:
 

import myfib

if __name__ == "__main__":
    myfib.Doing('A,B,C,A,A,A')

其中myfib就是在第5步创建的C++文件名,调用的时候需要先引用然后再使用其中的方法。执行结果如下:
 

A
B
C
A
A
A

可以看到,执行结果和直接执行Demp.py是完全一样的;
8、至此python转C++已经完成。但是还要记得,把第4步中创建的pyx文件备份到别处,因为现在已经不需要python脚本了。
最后总结,完成上面操作后,我简单测试了一下,可以明显感觉到运行效率有提升,但是由于时间问题,没有仔细量化改善效果。感觉可能提高了20%左右,但是这个数据不严谨。另外针对不同的算法,提升效果也不太一样
 

你可能感兴趣的:(python,开发语言,Cython)