数据结构论坛

注册

 

发新话题 回复该主题

这才是正确写Python的姿势,你不过是 [复制链接]

1#

Python可以通过c/c++语言来扩展我们自己的模块,在Python.h中作者提供了基础数据结构和方法,帮助我们在c/c++中调用Python的API,同时我们也可以用c/c++来封装自己的模块。编写c/c++的代码,并且需要调试是让很多初级程序员很头疼的一件事,但是为什么还是要编写c/c++呢?原因很简单,但我们对性能要求比较高,或者程序处理数据的效率高,那么我们就需要一些底层的语言来封装我们处理数据的模块,然后供Python来调用,Python是一门高级语言,开发效率很高,但是性能不及c/c++的。

文件example.h

如何入门Python的扩展开发呢?首先需要知道如何编写高效、高质量的c/c++代码,其次足够了解Python.h中封装的数据结构和方法,知道Python模块的调用关系。作为一名优秀的程序员,我们不仅需要了解如何编写Python,同时我们也需要知道Python的底层设计,可以让我们规避一下性能的问题,提升快速定位bug的能力。有些人定位bug,需要将数据下载本地,反复调试才能找出来,而有些人看一眼代码就知道了。

文件example.c

Python.h有三个必须了解的数据结构,PyObject、PyTypeObject、还有就是引用计数。很多高级语言都会使用引用计数来回收垃圾内存,至于为什么要回收垃圾内存是因为,程序运行很久之后,有内存泄漏,最终会因为内存溢出而崩溃。调用Python的API之前我们需要调用Py_Initailize()初始化解释器,调用PyRun_SimpleString(printhelloworld)来执行python的语句,结束之后需要调用Py_Finalize()来结束调用。

文件wrapper.c

如果实现Python模块呢?请看图片。我们通过wrap_fact定义一个自己的方法,将方法写入到exampleMethods这个数组对象中,然后调用initexmaple方法,里面会调用Py_InitModule,生成一个example的模块,而这个模块中的方法就是fact,编译之后我们就可以导入模块importexample,调用print(fact(2))完成c的调用了,如下是用Makefile编写的脚本,命令批处理,不需要我们每次执行大量的命令来编译Python模块,简简单单的makeall即可自动编译Python,makeclean清除多余的代码和库。

编写Makefile自动化编译Python模块

推荐两款不错的源码分析工具SourceInsight和Jetbrains的Clion,两款产品都是付费的,但是还是建议用Cloin,虽然贵点儿,但是代码的静态分析做的十分的棒。

分享 转发
TOP
发新话题 回复该主题