返回介绍

建议90:使用 C/C++ 模块扩展提高性能

发布于 2024-01-30 22:19:09 字数 2301 浏览 0 评论 0 收藏 0

Python具有良好的可扩展性,利用Python提供的API,如宏、类型、函数等,可以让Python方便地进行C/C++扩展,从而获得较优的执行性能。所有这些API却包含在Python.h的头文件中,在编写C代码的时候引入该头文件即可。来看一个简单的扩展例子。

1)先用C实现相关函数:以实现素数判断为例,文件命名为testextend.c。也可以直接使用C语言实现相关函数功能后再使用Python进行包装。

include "Python.h"
static PyObject *pr_isprime(PyObject *self, PyObject *args){
     int n, num;
     if (!PyArg_ParseTuple(args, "i", &num))        #
解析参数
    return NULL;
     if (num < 1) {
         return Py_BuildValue("i", 0);        #C
类型的数据结构转换成Python
对象
     }
     n = num - 1;
     while (n > 1){
         if (num%n == 0) return Py_BuildValue("i", 0);;
         n--;
     }
     return Py_BuildValue("i", 1);
}
static PyMethodDef PrMethods[] = {
     {"isPrime", pr_isprime, METH_VARARGS, "check if an input number is prime 
      or not."},
     {NULL, NULL, 0, NULL}
};
void initpr(void){
     (void) Py_InitModule("pr", PrMethods);
}

上面的代码包含以下3部分。

导出函数:C模块对外暴露的接口函数pr_isprime,带有self和args两个参数,其中参数args中包含了Python解释器要传递给C函数的所有参数,通常使用函数PyArg_ParseTuple()来获得这些参数值。

初始化函数:以便Python解释器能够对模块进行正确的初始化,初始化时要以init开头,如initp。

方法列表:提供给外部的Python程序使用的一个C模块函数名称映射表 PrMethods。它是一个PyMethodDef结构体,其中成员依次表示方法名、导出函数、参数传递方式和方法描述。看下面这个例子。

struct PyMethodDef { 
   char* ml_name;                 #
方法名
PyCFunction ml_meth;              #
导出函数
int ml_flags;                   #
参数传递方法
   char* ml_doc;                #
方法描述
};

参数传递方法一般设置为METH_VARARGS,如果想传入关键字参数,则可以将其与METH_KEYWORDS进行或运算。若不想接受任何参数,则可以将其设置为METH_NOARGS。该结构体必须以{NULL,NULL,0,NULL}所表示的一条空记录来结尾。

2)编写setup.py脚本。

from distutils.core import setup, Extension
module = Extension('pr', sources = ['testextend.c'])
setup(name = 'Pr test', version = '1.0', ext_modules = [module])

3)使用python setup.py build进行编译,系统会在当前目录下生成一个build子目录,里面包含pr.so和pr.o文件,如图8-7所示。

图8-7 使用Python进行编译

4)将生成的文件pr.so复制到Python的site_packages目录下,或者将pr.so所在目录的路径添加到sys.path中,就可以使用C扩展的模块了,如图8-8所示。

图8-8 导入编译后的模块

更多关于C模块扩展的内容请读者参考http://docs.python.org/2/c-api/index.html。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文