学习python是一个令人振奋不已的过程,python是一个如此powerfull的高级语言,简单却功能强大,库多而又功能齐全,几乎可以帮助我们完成任何一项工作。它唯一的缺陷就是跑得慢,在跑得慢的问题上,它有有着令人振奋的解决方案,嵌入c\c++代码的方法。一个程序80%的时间运行在20%的代码上,我们只要用c重写那20%的代码,便可缔造完美程序。
除了运行速度问题,还有其他可以用c来增强的功能。如python2.5可递归栈的最大层次是999,而c却远远大于这个限制。
exmaple.c
wrap.c
编译
fact.py
运行结果:
lwj@lwj-desktop:~/code/python$ python fact.py
the python fact takes: 0:00:01.214449
the c fact taks: 0:00:00.121041
c要快了》10倍。不过还没测试过单纯的c的环境。。。有空再测测。。。。
另外python本身只能递归999层深度
c没有这个限制
除了运行速度问题,还有其他可以用c来增强的功能。如python2.5可递归栈的最大层次是999,而c却远远大于这个限制。
exmaple.c
- /*
- *=============================================================================
- ========
- *
- *Filename:example.c
- *
- *Description:embedcinpython
- *
- *Version:1.0
- *Created:2008年12月15日20时48分19秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=============================================================================
- ========
- */
- intfact(intn)
- {
- if(n<=1)
- return1;
- else
- returnn*fact(n-1);
- }
- /*
- *=============================================================================
- ========
- *
- *Filename:wrap.c
- *
- *Description:candpython
- *
- *Version:1.0
- *Created:2008年12月15日20时49分11秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=============================================================================
- ========
- */
- #include<Python.h>
- //导出函数
- PyObject*wrap_fact(PyObject*self,PyObject*args)
- {
- intn,result;
- if(!PyArg_ParseTuple(args,"i:fact",&n))
- returnNULL;
- result=fact(n);
- returnPy_BuildValue("i",result);
- }
- //方法列表
- staticPyMethodDefexampleMethods[]=
- {
- {"fact",wrap_fact,METH_VARARGS,"CaculateN!"},
- {NULL,NULL}
- };
- //初始化函数
- voidinitexample()
- {
- PyObject*m;
- m=Py_InitModule("example",exampleMethods);
- }
编译
gcc -fpic -c -I/usr/include/python2.5 \
-I /usr/lib/python2.5/config \
example.c wrapper.c
gcc -shared -o example.so example.o wrapper.o
fact.py
- importexample
- importdatetime
- deffact(n):
- ifn<=1:return1
- else:returnn*fact(n-1)
- if__name__=='__main__':
- now=datetime.datetime.now()
- foriinrange(10000):
- n=fact(100)
- end=datetime.datetime.now()
- print'thepythonfacttakes:',end-now
- foriinrange(10000):
- n=example.fact(100)
- print'thecfacttaks:',datetime.datetime.now()-end
运行结果:
lwj@lwj-desktop:~/code/python$ python fact.py
the python fact takes: 0:00:01.214449
the c fact taks: 0:00:00.121041
c要快了》10倍。不过还没测试过单纯的c的环境。。。有空再测测。。。。
另外python本身只能递归999层深度
c没有这个限制