作者KSJ (阿真)
看板Python
标题[心得] 结合Python 与 C(++) 的优点
时间Mon Apr 13 16:57:39 2009
就我的感觉:
Python:
直观(也直译)
很多模组可供使用(较易上手 例如import ),"不用重新做轮子"
C/C++:
算得快,
可以做很多基层的事(例如 指标、指标的指标、很难理解的东西 但会用很方便)
所以我就结合Python的 使用方便性 跟 C++的 运算速度
这样使用Python运算大量资料时(其实是给C++算) 也能很快
我写了一个简单档案compare_Py_C.py
程式会将输入的 整数i 加1加1的慢慢加100000000次 然後输出结果
(例如 useC(20) 将会输出 100000020)
---以下有误 请见推文---
/*特别一提 100000000 早已超过C的整数范围 可是算出来 答案还是对的0.0*/
/*不过这里只比较速度 所以先不理它吧 囧 */
---以上有误 请见推文---
里面有二个函式 目的一样 但一个用C++ 一个用Python:
def usePython(i):
from time import time
start=time()
for j in range(100000000):
i+=1
end=time()
return end-start
def useC(i):
from time import time
start=time()
import spam #这是spam.pyd 动态函式库(不知道有没有讲错)
i=spam.useC(i) #这是spam.pyd里 定义的函式
end=time()
return end-start
同样是在Python Shell底下测试(因为Python比较易用(对我来说))
得到的时间比约为 至少 500倍 (快50秒 : 不到0.1秒)
所以当程式计算量大的时候 计算部份交给C算是不错的选择
至於怎麽用C++写Python的extending 再complie成pyd档案
在官网有一个简单的例子:
http://docs.python.org/extending/extending.html
(我用的为extending部份 embedding没用到)
但是处理大量资料的时候 大部份会使用Python的 Sequence (list、tuple等)
所以怎麽传Sequence给C的Array
跟 怎麽把算完的结果(也许是C的Array) 传回给Python显示(或拿来继续使用)
就变得很重要
我找了n个网站 把我认为比较好的推荐给大家
http://superjared.com/entry/anatomy-python-c-module/
简单的费氏数列 例子 但我从里面学到 如何回传Python的list
(方法意外的简单给我很大的打击 囧)
http://0rz.tw/kEs1x
这篇的目的应该是连结既有的C函式
会学到如何从Python输入Sequence给C的array
以上分享给版友 有错欢迎指正(十分感谢) 也欢迎一起讨论
也希望有在写类似这样程式架构的版友 可以分享一下心得
PS.我对reference count怎麽解释 跟它在Python、C之间有什麽关系
目前还是一头雾水...有人有推荐什麽好的网站吗??
官网有看过 不过感觉还不够基本...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.63.180
1F:推 bobhsiao:1亿没超过int的范围 04/13 19:47
2F:→ KSJ:C 的是-32768~32767 C++的是2^32/2(我是用C++写) 感谢指错:) 04/13 20:40
※ 编辑: KSJ 来自: 140.112.63.180 (04/13 20:42)
3F:推 StubbornLin:你可以用boost.python 04/14 00:11
4F:推 sbrhsieh:C的int使用的byte数也是depend on编译器.不一定得是2byte 04/14 00:12
6F:→ StubbornLin:用来包物件给python用会轻松很多 04/14 00:13
7F:→ StubbornLin:又或着你有另一个选择 使用ctypes来直接引用dll 04/14 00:13
9F:推 sbrhsieh:上面连结的文章中,把 SWIG 笔误成 SWING 04/14 00:40
10F:推 StubbornLin:感谢 已修正 04/14 01:39
11F:→ KSJ:感谢提供资讯 试着阅读中 04/14 01:52
12F:推 bizkit:有try过挂psyco跑看看吗? 04/22 09:41
13F:推 rdmtb:跑个1~1000000000,从早上到现在还没好,orz......, 05/27 16:36
14F:→ rdmtb:大概是电脑太旧了. 05/27 16:36