Python调用C库函数

举报
jackwangcumt 发表于 2021/11/28 15:48:46 2021/11/28
【摘要】 Python在很多领域都有重要的应用。特别是近期的人工智能、视频识别以及网络等领域,Python都有大量的库可以直接使用,但考虑到Python语言的一些不足,有时候对于性能要求非常高的场景,则需要借助Python与C或C++等语言的交互性特征来解决,即Python可以调用C语言或者C++的库。本文用实例讲解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/ ,官网界面如下所示:

0.jpg
     下载的文件名称为 code_1.62.3-1637137107_amd64.deb ,其中的 .deb为Ubuntu上可安装的文件,下载的文件如下所示: 

1.jpg
       首先在项目目录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秒 。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。