Python调用C库函数
1 Python交互概述
Python语言是一种面向对象的编程语言,它是解析执行的,因此执行效率不高。但是由于Python语言的开源特征以及拥有丰富的、功能强大的社区库,因此,Python在很多领域都有重要的应用。特别是近期的人工智能、视频识别以及网络等领域,Python都有大量的库可以直接使用,但考虑到Python语言的一些不足,有时候对于性能要求非常高的场景,则需要借助Python与C或C++等语言的交互性特征来解决,即Python可以调用C语言或者C++的库。
除了Python可以调用C语言或者C++的库外,还支持Python调用C#或者Java语言编译的库。比如与C#库交互,则可以利用IronPython框架,它是一个.NET平台上的Python实现,包括了完整的编译器、执行引擎与运行时支持,能够与.NET已有的库无缝整合到一起。而与Java库交互,则可以利用Jython框架,它是一个Python语言在Java语言中的完全实现。Jython也有很多从CPython中继承的模块库,因此非常重要。
2 Python 调用C
前面提到,Python语言的解析器大部分都是用C语言编写的,而Python也可以非常方便的与C语言进行交互。下面首先给出用Python来调用C语言库的简单示例。这里我们在Ubuntu操作系统上进行代码开发。首先为了提高编程的效率,这里我们先下载一个Visual Studio Code开源工具,它是微软推出的,具备非常强大的功能,支持多种编程语言,而且界面美观,可以通过插件来扩展不同的语言支持。
可以访问官网进行Visual Studio Code工具的下载,官网地址为 https://code.visualstudio.com/ ,官网界面如下所示:
下载的文件名称为 code_1.62.3-1637137107_amd64.deb ,其中的 .deb为Ubuntu上可安装的文件,下载的文件如下所示:
首先在项目目录mycpp中,通过Visual Studio Code ( VSCode ) 工具创建一个名为 mymath.c 的文件,内容如下所示:
#include <stdio.h>
long sum(long n){
long ret = 0;
for(long i = 1; i <= n; i++){
ret += i;
}
return ret;
}
int main () {
printf("Hello C\n");
return 0;
}
其中的代码非常简单,首先引入标准IO库stdio头文件,然后定义一个sum函数,它接受一个long类型的参数,并内部求和,并返回结果。 然后定义了一个入口函数main ,其中就是打印一些欢迎语句。至此,我们有了一个简单的C语言编程的库,下面我们可以用编译器gcc来编译一下,执行如下命令:
gcc mymath.c -o mymath.out
编译成功后,会在目录中生成一个可执行文件mymath.out ,并通过如下命令执行:
./mymath.out
输出信息如下所示:
Hello C
说明默认执行了main函数中的内容。为了让Python可以调用C语言编写的库,需要通过gcc编译器将其编译成为动态链接库( .so )文件,可以执行如下命令:
gcc mymath.c -shared -o lib_math.so
其中的 -shared 参数指定要生成动态链接库,而 -o lib_math.so 则指明输出的库文件名 lib_math.so 。下面可以利用Python来调用 lib_math.so 库中的函数,下面给出Python代码:
from ctypes import *
mymath = CDLL('/home/jack/mysoft/mycpp/lib_math.so')
s = mymath.sum(1000)
即通过ctypes中的CDLL可以引入 lib_math.so 库,并可以直接访问内部的函数sum 。
3 Python 调用C 性能
为了演示Python如何调用C语言的函数,以及执行效率的情况,下面给出一个演示性能的示例,核心代码如下所示:
from ctypes import *
import time
def sum_p(m):
ret = 0
for i in range(m + 1):
ret += i
return ret
if __name__ == '__main__':
mymath = CDLL('/home/jack/mysoft/mycpp/lib_math.so')
n = 1000
time_start = time.time()
for i in range(10000):
s = mymath.sum(n)
# print(s)
time_end = time.time()
# time cost 0.03960776329040527 s
print('time cost', time_end - time_start, 's')
time_start = time.time()
for i in range(10000):
s = sum_p(n)
# print(s)
time_end = time.time()
# time cost 1.7895867824554443 s
print('time cost', time_end - time_start, 's')
为了统计耗时,这里用了time模块中的函数来记录开始时间和结束时间,用for 循环执行10000次函数调用。耗时大约为0.03960776329040527秒,可以看出执行效率非常快。而Python原生的函数sum_p则耗时为1.7895867824554443秒 。
- 点赞
- 收藏
- 关注作者
评论(0)