同城200带吹电话-免费风楼阁全国约,附近人100块钱,上门服务24小时接单平台

当前位置:首页 >教程首页 > IT 学院 > 人工智能+Python开发工程师班 >如何用C语言写Python的扩展?

如何用C语言写Python的扩展?

发布时间:2019-09-17 09:40:22

用Python开发确实为我们减少了很多的约束和开发成本,从而让我们能够更加的专注于逻辑而非语法。但是,开发效率虽然提高了,但却带来了运行性能的问题。那如何用C语言写Python的扩展?

1.jpg

万幸的是,虽然上帝关掉了我们一扇门,但是却为我们打开了另一扇窗,因为底层是用 C语言 写的,所以我们可以将一些性能损耗比较大的功能,或者模块,通过 C语言 重写,然后 import xxxx 来无缝结合。

哪怕工作中有比较少的机会自己写C扩展, 了解这块的知识,这也有利于我们更加深入的了解 Python 的运行本质。

网上的例子都是通过 ctypes 或者 setup.py 的方式实现引用和编译安装,今天在这边想试下最原始的方法~

1. 实现接口函数

接口函数是什么意思?可以简单理解成就是 Python 和 C 的对接函数,举个例子:

2.jpg

从上述的例子中可以看到这个函数和传统意义上的 C 用法有点不同了,特别是在函数形参那边的PyObject self, PyObject args

第一个参数是 PyObject *self,这个参数是Python内部使用的,可以不用管;

第二个参数是 PyObject *args,这个参数非常重要,因为这个揽括了所有传给函数的参数。它是一个参数列表,把所有的参数都整合到。

一个 string, 因此,如果我们需要解析这些参数需要用特定的方法!我们需要用到 PyArg_ParseTuple 来解开这个扣人心弦的入口!

PyArg_ParseTuple 函数说明:

args就是需要转换的参数;

ii 就是参数类型的格式符号,这里代表 int init;

后面的 &arg1, &arg2 就是通过参数解析提取的值,存放的地方,这有点类似 C 的 scanf;

很明显的,这三个参数,在数量上存在这一定的联系,也就是,传进去两个 int参数,那么就肯定是对应了两个 ii,然后就会对应存在 两个实际的"容器"内,这里要注意,一不小心就会 Segmentation fault

对应有解析参数的,肯定也有 C???值转换成 Python对象 的,那就是 Py_BuildValue。

Py_BuildValue 函数说明:

3.jpg

第一个参数 和 PyArg_ParseTuple 的第二个参数一样,都是格式化符号;

第二个参数是需要转换的参数,函数 Py_BuildValue 会把所有的返回指都组装成 tuple 给 Python

2. 定义方法列表

4.jpg

PyMethodDef 是一个 C结构体,用来完成一个映射,也就是便于方法查找,我们把需要被外面调用的方法都记录在这表内。

PyMethodDef 结构体成员说明:

第一个字段:在 Python 里面使用的方法名;

第二个字段:C ??槟诘暮?;

第三个字段:方法参数类型,是无参数(METH_NOARGS) , 还是有位置参数(METH_VARARGS), 还是其他等等;

第四个字段:方法描述,就是通过 help() 或者 doc 可以看到的;

需要注意的是,这个列表的最后必须以 {NULL, NULL, 0, NULL} 的形式来代表声明结束,也有一些大佬用 {NULL, NULL},不过个人觉得写完整也不会累到哪去, 相反会比较直观。

5.jpg

正因为存在这样的一份记录表,Python 才能够寻找到相应的函数

同样的,如果我们想要找一个??榈?Python 函数 对应什么的 C??榉椒?,也能通过这地方比较粗暴得知,例如 Python 的 list

6.jpg

3. 实现初始化函数 (关键)

7.jpg

需要特别注意的是,这个函数名不能像上面那样,这是有规定的,必须是 init + ??槊?,比方说,我的最后编译出来的文件是 test.so, 那我的函数名就是 inittest, 这样在 Python 导入 test ??槭?,才能找到这个函数并调用。

这里调用了 Py_InitModule 函数来将??槊趾陀成浔斫岷显谝黄?。表示 test 这个模块使用 testMethods 这个映射表。

编译导出

8.jpg

完整例子

test.c

9.jpg

test.py

10.jpg

学员作品赏析
  • 2101期学员李思庭作品

    2101期学员李思庭作品

  • 2104期学员林雪茹作品

    2104期学员林雪茹作品

  • 2107期学员赵凌作品

    2107期学员赵凌作品

  • 2107期学员赵燃作品

    2107期学员赵燃作品

  • 2106期学员徐正浩作品

    2106期学员徐正浩作品

  • 2106期学员弓莉作品

    2106期学员弓莉作品

  • 2105期学员白羽新作品

    2105期学员白羽新作品

  • 2107期学员王佳蕊作品

    2107期学员王佳蕊作品

专业问题咨询

你担心的问题,火星帮你解答
  • 广州视频剪辑培训机构有哪些

    在广州这座繁华的都市中,数字创意产业正蓬勃发展,广州视频剪辑培训成为许多影视爱好者的理想起点。随着短视频平台和影视制作需求的激......

  • 北京UI设计培训免费试听攻略

    在北京这样一座充满创意活力的都市,UI设计培训正成为无数年轻人追逐职业梦想的跳板。随着数字经济的蓬勃发展,UI设计行业在北京展......

  • 北京平面设计培训机构排名榜

    在当今创意经济蓬勃发展的浪潮中,北京平面设计培训成为众多职业追求者的理想起点。这座城市的活力与机遇吸引着无数人投身视觉艺术领域......

  • 北京虚幻引擎课程内容全解析

    在影视和设计行业蓬勃发展的今天,虚幻引擎作为核心技术工具,正引领着视觉创作的革命。越来越多的人渴望掌握这门技能,而专业的培训成......

  • 北京平面设计课程如何选择适合的

    在北京这座文化创意中心,平面设计培训行业蓬勃发展,为渴望入行的学员提供了丰富机遇。随着数字媒体和影视产业的崛起,掌握视觉传达技......

  • 上海3D建模短训班课程内容解析

    在上海这座充满活力的城市,影视和设计行业正迎来前所未有的发展机遇,数字技术的进步让3D建模成为创意产业的核心驱动力。参加专业的......

×

同学您好!

您已成功报名0元试学活动,老师会在第一时间与您取得联系,请保持电话畅通!
确定