| 查看: 226 | 回复: 0 | ||||
| 当前主题已经存档。 | ||||
[资源]
Python使用C模块来提高性能
|
||||
|
Python毕竟是解释型的语言,在复杂算法上的速度还是比C要差一点。另外大量的C的Library的重用也是一个很重要的话题。好在Python可以很容易的使用C编写的module来提高关键路径的性能和复用已有的C的Library。 OK,我们先来写个大整数乘法来看一下Python的性能。我对性能方面不是高手,这个例子不一定恰当。全当是个小实验。另外重点还是放在如何使用C编写的模块上。为了突出重点,就假设我们有C的Library的source code,或者C的module就是为了Python程序开发的。好,开始。先写个Python的实现。 #! /usr/bin/python #main.py import time import timeP import timeC t1 = time.time() timeP.time() t2 = time.time() timeC.time() t3 = time.time() print "ython module time: %f seconds" % (t2 - t1) print "C module time: %f seconds" % (t3 - t2) timeP是用Python写的Module,而timeC就是用C写的了。计算的内容都是一样的。 #! /usr/bin/python #timeP.py def time(): for i in range(0,100000): x = 123498 y = 98082432 z = x * y 在看C的module之前。我们要先学习几个基础知识。首先,每一个module都要告诉Python Interpreter到底这个模块有几个函数。这个是由"initMODULE_NAME"函数来实现的,其实就是把一个List作为参数传给Python/C API里的一个特殊函数做到的。 另外为了交换数据,c的module里的函数要以PyObject*作为返回类型,即使是不需要返回值的,也要返回Py_None,就是Python里的None啦。俺就是一开始没有注意,结果一直segmentation fault。 最后,一定要include Python.h(废话) #include #include "time_test.h" ///timeC.c /// the wrapper for time_test.c static PyObject* timeC_time() { time_test(); return Py_None; } static PyMethodDef timeCMethods[] = { {"time", timeC_time, METH_VARARGS, "Execute a shell command."}, {NULL, NULL, 0, NULL} /* Sentinel, end of list of functions*/ }; PyMODINIT_FUNC inittimeC() { Py_InitModule("timeC", timeCMethods); } 这个module其实是一个C的Library(库的例子,没有这么mini的库啦,呵呵)的wrapper。我顺便把C的Library的code也贴在这里: #ifndef _TIME_TEST_H #define _TIME_TEST_H extern void time_test(); #endif #include "time_test.h" ///time_test.c void time_test() { int x = 123498; int y = 98082432; int z = 0; int i; for (i = 0 ; i < 100 ; i++) { z = x * y; } } int main() { time_test(); return 0; } 接下来该编译了(需要编译的语言好麻烦,:p)。Python提供了编译C的module的简单方法。就是写一个setup脚本: #! /usr/bin/python from distutils.core import setup, Extension module1 = Extension('timeC', sources = ['timeC.c', 'time_test.c']) setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1]) 只要执行一下./setup.py build,就可以编译了。 编译好了之后,把生成的.so文件copy到当前目录。Run一下main.py看看结果。我的机器是P4 1.8, RHEL4WS。结果如下: Python module time: 4.386378 seconds C module time: 0.000432 seconds [ Last edited by csfn on 2008-12-29 at 19:54 ] |
» 收录本帖的淘帖专辑推荐
ML相关 | source |
» 猜你喜欢
Bioresource Technology期刊,第一次返修的时候被退回好几次了
已经有6人回复
2025冷门绝学什么时候出结果
已经有4人回复
真诚求助:手里的省社科项目结项要求主持人一篇中文核心,有什么渠道能发核心吗
已经有8人回复
寻求一种能扛住强氧化性腐蚀性的容器密封件
已经有5人回复
论文投稿,期刊推荐
已经有6人回复
请问哪里可以有青B申请的本子可以借鉴一下。
已经有4人回复
孩子确诊有中度注意力缺陷
已经有14人回复
请问下大家为什么这个铃木偶联几乎不反应呢
已经有5人回复
请问有评职称,把科研教学业绩算分排序的高校吗
已经有5人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有4人回复













回复此楼