python 调用C语言DLL的方法

生成DLL文件

这里使用的开发工具是Dev C++,详细方法可以查看下面这篇文章:
Dev c++工具将C代码生成dll文件以及如何调用dll文件
需要注意的一点是,64位python解释器只能调用64位的dll文件,因此需要安装64位编译器来编译C代码。

新建DLL项目

点击文件->新建->项目,选择DLL,语言选择C项目,然后选择名称和保存位置。
在这里插入图片描述

编写函数代码

新项目会默认生成dllmain.cdll.h两个文件,dll.h中声明了一个函数名,dllmain.c则包含了函数的具体内容,修改函数只需要修改这两个文件中的函数名和函数内容即可,不需要更改其他内容。
修改后,代码中包含了一个名为HelloWorld的函数,功能就是向命令行输出一串文字。
在这里插入图片描述
在这里插入图片描述

编译导出

在工具栏选择编译器为64位,如果没有则需要自行安装。
在这里插入图片描述
点击运行->编译,或者工具栏上的编译按钮,即可生成dll文件。

在这里插入图片描述
打开工程所在的文件夹,会发现有一个dll结尾的文件,只需要将这个dll文件复制到需要调用的位置即可。
在这里插入图片描述

python调用

使用python自带的ctypes即可调用,调用步骤是

  1. 加载DLL模块
  2. 定义函数参数类型
  3. 定义函数返回值类型
  4. 调用函数
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秒。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高堂明镜悲白发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值