python 调用C语言DLL的方法
生成DLL文件这里使用的开发工具是Dev C++,详细方法可以查看下面这篇文章:Dev c++工具将C代码生成dll文件以及如何调用dll文件需要注意的一点是,64位python解释器只能调用64位的dll文件,因此需要安装64位编译器来编译C代码。新建DLL项目点击文件->新建->项目,选择DLL,语言选择C项目,然后选择名称和保存位置。编写函数代码新项目会默认生成dllmain.c
生成DLL文件
这里使用的开发工具是Dev C++,详细方法可以查看下面这篇文章:
Dev c++工具将C代码生成dll文件以及如何调用dll文件
需要注意的一点是,64位python解释器只能调用64位的dll文件,因此需要安装64位编译器来编译C代码。
新建DLL项目
点击文件->新建->项目,选择DLL,语言选择C项目,然后选择名称和保存位置。
编写函数代码
新项目会默认生成dllmain.c
和dll.h
两个文件,dll.h中声明了一个函数名,dllmain.c则包含了函数的具体内容,修改函数只需要修改这两个文件中的函数名和函数内容即可,不需要更改其他内容。
修改后,代码中包含了一个名为HelloWorld的函数,功能就是向命令行输出一串文字。
编译导出
在工具栏选择编译器为64位,如果没有则需要自行安装。
点击运行->编译,或者工具栏上的编译按钮,即可生成dll文件。
打开工程所在的文件夹,会发现有一个dll结尾的文件,只需要将这个dll文件复制到需要调用的位置即可。
python调用
使用python自带的ctypes即可调用,调用步骤是
- 加载DLL模块
- 定义函数参数类型
- 定义函数返回值类型
- 调用函数
import ctypes
libc= ctypes.cdll.LoadLibrary('sample.dll')#这里的参数是文件路径
#libc.HelloWorld.argtypes =[ctypes.c_char_p,ctypes.c_char_p]#指定参数类型,此函数没有参数,仅作示例
#libc.HelloWorld.restype=ctypes.c_double #指定函数的返回值类型,此函数没有返回值,仅作示例
libc.HelloWorld() #调用dll内的函数
输出
Hello world from dll!
调用成功。
测试
为了测试效率首先编写一个即简单又耗时的函数,比如求圆周率:
这个方法借鉴了蒙特卡洛方法,不足之处不必深究,仅仅为了测试效率而已。
def getPi()->float:
length=10000 #圆半径长
circle:int=0 #圆形内的点的数量
retangle=length*length#方形区域面积
for x in range(length):
for y in range(x):
if x*x+y*y<retangle:
circle+=1
return circle/retangle*8
然后需要在Dev C++中建立DLL项目,在dll.h
文件中将DLLIMPORT void HelloWorld();
替换为DLLIMPORT double getPi();
然后修改dllmain.c
文件,更改函数如下:
DLLIMPORT double getPi() {
long length = 10000;
long circle = 0;
long retangle;
double pi;
retangle = length * length;
for (int x = 0; x < length; x++) {
for (int y = 0; y < x; y++) {
if (x * x + y * y < retangle) {
circle++;
}
}
}
pi = (double)circle / retangle * 8.0;
//printf_s("Value = %f\n", pi);
return pi;
}
编译成dll文件,然后手动复制到python程序所在的目录。
python主程序:
import time
def getPi()->float:
length=10000
circle:int=0 #圆形内的点的数量
retangle=length*length#方形区域面积
for x in range(length):
for y in range(x):
if x*x+y*y<retangle:
circle+=1
return circle/retangle*8
def getPiC()->float:
import ctypes
libc= ctypes.cdll.LoadLibrary('pi2.dll')
#libc.getPi.argtypes =[ctypes.c_char_p,ctypes.c_char_p]#指定参数类型,此函数没有参数,仅作示例
libc.getPi.restype=ctypes.c_double #指定函数的返回值类型
pi2=libc.getPi()
return pi2
print("Python函数运算:")
start=time.time()
pi1=getPi()
end=time.time()
print(f'运算用时:{end-start}')
print(f'运算结果:{pi1}')
print("C语言函数运算:")
start=time.time()
pi2=getPiC()
end=time.time()
print(f'运算用时:{end-start}')
print(f'运算结果:{pi2}')
运算结果:
Python函数运算:
运算用时:7.608693599700928
运算结果:3.14170728
C语言函数运算:
运算用时:0.08440113067626953
运算结果:3.14170728
python函数和c函数用时差距明显,python用时7.60秒,而C函数仅用时0.08秒。
更多推荐
所有评论(0)