在python中嵌入c\c++

学习python是一个令人振奋不已的过程,python是一个如此powerfull的高级语言,简单却功能强大,库多而又功能齐全,几乎可以帮助我们完成任何一项工作。它唯一的缺陷就是跑得慢,在跑得慢的问题上,它有有着令人振奋的解决方案,嵌入c\c++代码的方法。一个程序80%的时间运行在20%的代码上,我们只要用c重写那20%的代码,便可缔造完美程序。
除了运行速度问题,还有其他可以用c来增强的功能。如python2.5可递归栈的最大层次是999,而c却远远大于这个限制。


exmaple.c
  1. /*
  2. *=============================================================================
  3. ========
  4. *
  5. *Filename:example.c
  6. *
  7. *Description:embedcinpython
  8. *
  9. *Version:1.0
  10. *Created:2008年12月15日20时48分19秒
  11. *Revision:none
  12. *Compiler:gcc
  13. *
  14. *Author:LiWeiJian(mn),lwj1396@163.com
  15. *Company:hunanuniversity
  16. *
  17. *=============================================================================
  18. ========
  19. */
  20. intfact(intn)
  21. {
  22. if(n<=1)
  23. return1;
  24. else
  25. returnn*fact(n-1);
  26. }
wrap.c
  1. /*
  2. *=============================================================================
  3. ========
  4. *
  5. *Filename:wrap.c
  6. *
  7. *Description:candpython
  8. *
  9. *Version:1.0
  10. *Created:2008年12月15日20时49分11秒
  11. *Revision:none
  12. *Compiler:gcc
  13. *
  14. *Author:LiWeiJian(mn),lwj1396@163.com
  15. *Company:hunanuniversity
  16. *
  17. *=============================================================================
  18. ========
  19. */
  20. #include<Python.h>
  21. //导出函数
  22. PyObject*wrap_fact(PyObject*self,PyObject*args)
  23. {
  24. intn,result;
  25. if(!PyArg_ParseTuple(args,"i:fact",&n))
  26. returnNULL;
  27. result=fact(n);
  28. returnPy_BuildValue("i",result);
  29. }
  30. //方法列表
  31. staticPyMethodDefexampleMethods[]=
  32. {
  33. {"fact",wrap_fact,METH_VARARGS,"CaculateN!"},
  34. {NULL,NULL}
  35. };
  36. //初始化函数
  37. voidinitexample()
  38. {
  39. PyObject*m;
  40. m=Py_InitModule("example",exampleMethods);
  41. }


编译
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
  1. importexample
  2. importdatetime
  3. deffact(n):
  4. ifn<=1:return1
  5. else:returnn*fact(n-1)
  6. if__name__=='__main__':
  7. now=datetime.datetime.now()
  8. foriinrange(10000):
  9. n=fact(100)
  10. end=datetime.datetime.now()
  11. print'thepythonfacttakes:',end-now
  12. foriinrange(10000):
  13. n=example.fact(100)
  14. 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没有这个限制


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值