window 和 linux 系统调用 c++函数生成的可执行文件。
由于网络学习的python代码中某一步骤处理速度太慢,所以用可执行文件代替,加快训练运行速度,记录如下:
#######################################################################################################################################################################################
window系统上使用VS编译c++函数,生成python可执行文件,并调用。
使用vs建立c++工程,配置,编写函数规范
参考网站:
https://blog.csdn.net/qq_29176963/article/details/103899333
https://blog.csdn.net/maosijunzi/article/details/79354806
建立c++空项目,配置如下。
注意点一:c++代码中有#include <Python.h> ,此 python包含目录和库目录及依赖项需要是最终要运行的python代码中的python环境库。我的python项目是Anaconda中的安装的python库,所以有下面的相关配置。
注意点二: python代码中传入的参数是list类型,需要转换为c++函数中需要的类型;同样c++函数运行后输出也要转换为list类型传回给python代码环境。因此需要在c++代码中写转换函数以进行转换。
c++函数主要几个部分包括:
(1)初始化函数,此部分是python调用执行的开始。
注意project_name就是你的项目名称,注意修改。PCmodule是下面的定义的模块。
(2)模块定义部分
“fs”名字可以随意,test_methods是这各模块中的方法列表名称,可以包含多个方法,见下面。
(3): 方法定义:
这里方法里面只有一个方法模块,可以定义多个方法模块。如下面定义了两个方法GGgroup,GGgroup1:
(4),方法实现函数:ffFs方法
方法实现函数里面主要有下面几个部分:
(a),接收调用传入的参数:整数等常见类型直接可以接收,其他的类型则要通过Pyobject定义类型接收。顺序按照传入参数的顺序,"oi"分别指类型对象和整数。
(b), python传入参数类型转换为c++函数可辨识类型。这里以下面的函数为例:
在上面方法实现函数中对其进行调用:
(c), c++功能函数部分: 即你要用c++代码实现的功能,因为现在输入的参数已经知道且转换完毕了。
将其在方法实现函数中调用。
(d), 将c++功能函数返回值转换为python类型并返回,以下函数为例。
在方法实现函数中的调用:
如果方法列表中包含多个方法,则需要定义多个方法函数。
注意点三:内存泄漏问题。c++代码要保证不存在内存泄漏问题,如果每次调用这个执行函数文件,都存在内存的泄露,内存会不断增加消耗。
如下图中的注意一步,必须要释放新建的PyList_New, 若是返回值就不需要释放。:
参考网站:
https://www.cnblogs.com/OCaml/archive/2012/06/29/2568920.html
https://ask.csdn.net/questions/362191
主要注意代码中是否有需要释放的变量。
编译生成工程,生成DLL文件,修改为.pyd文件,将其放入对应python环境中Lib\site-packages文件夹下,然后就可以在python代码中import使用了。
######################################################################################################################################################################################################################################
linux系统上使用g++编译c++函数,生成python可执行文件并调用
参考网站:
https://blog.csdn.net/sinat_37532065/article/details/86537247
linux系统上调用的是.so文件,因此需要使用g++将.cpp文件编译成.so文件,然后放入对应python环境中lib/python3.7/文件夹中,在python代码import调用。
注意点:编译命令需要带有优化参数,否则代码运行非常慢。上面的vs编译中有优化参数。
注意点1: 代码修改
在上述代码的基础上,加上模块初始化函数声明和主函数调用部分。
注意点2,代码编译优化选项和参数路径
到cpp文件所在文件夹执行编译命令。
代码如下:这里要选择正确的python路径,参照上面python路径,linux和windows上的包含路径有所不同。即包含Python.h文件的路径。
可以在文件中设置,也可以直接在命令行内指定,包含路径设置,库路径设置等参考网站:
https://blog.csdn.net/arackethis/article/details/43342655
优化参数设置:
这里在命令中加入 -O2选项即可。参考网站:
https://blog.csdn.net/hit_090420216/article/details/44900215
https://blog.csdn.net/weixin_38145317/article/details/105241512