作者KSJ (阿真)
看板Python
标题Re: [心得] 结合Python 与 C(C++) 的优点
时间Tue Apr 14 01:39:14 2009
: 我不知道你 C function 是如何实作出你形容的功能,我想应该只是一个简单的 for
: loop 利用 counter 来计数,每个 iteration increment 一个 int 变数 by 1。
: 如果是这样的话,这个比较其实是不太对等。
我应该是这样写的没错(文後有程式码)
我得先说非常抱歉 做了一个不太对等的比较<(_ _)>
我只是用就我所学的方式来写(现在看起来之间写法很有改善的空间 因为要算很久)
我本来不知道以下你说的那些 现在比较了解
也谢谢你的说明 十分清楚:)
: 在Python 3.0 以前,range 不是产生 iterator,range(100000000) 这个
: expression 所作的事是配置至少 100000000 个 4 bytes(for 100000000 个 int
: object),并且分别填入 0 ~ 100000000-1,并且配置 4 * 100000000bytes(for
: list object本身),这跟 C function 做的事差太多了。
: 可否麻烦你试着把 usePython 改成:
: def usePython(i):
: from time import time
: start = time()
: for j in xrange(100000000):
xrange以前都不知道怎麽用 现在查了资料了解如下:
range(100): 产生一个list 再拿list里面的值 适合用在 range(可叠代的变数)
xrange(100):一个一个值拿出来 很适合用在叠代1.2.3.4这样
我之前用range来跑 实在差很多...
: i += 1
: return time()-start, i
: 或:
: def usePython(i):
: from time import time
: start = time()
: j = 0
: while j < 100000000:
: i += 1
: j += 1
: return time()-start, i
: 再比较一下跟 C implementation 的差异约是多少。
我把上面二个分别取为usePython1 跟usePython2 (原来的是usePython 跟useC)
结果如下:
>>> from compare_Py_C import *
>>> usePython1(20)
(14.906000137329102, 100000020)
>>> usePython2(20)
(26.609000205993652, 100000020)
>>> useC(20)
(100000020, 0.4849998950958252) <==这是我本来的程式 有输出i值
>>>
至於 原本的usePython 跑太久没出来我就restart了(用家里的p4跑的)
另外我也把extending的C++档重要部份节录下来:
static PyObject *
useC(PyObject *self, PyObject *args)
{
int i,j;
if (!PyArg_ParseTuple(args, "i", &i))
return NULL;
for (j=0;j<100000000;j++){
i=i+1;
};
return Py_BuildValue("i", i);
}
是用以上的方式写的 应该是如您所说的方式吧
最後 再次谢谢你 让我学到很多
ps.事实上我之前写的程式 有叠代1.2.3.4...的 通通用range() 囧rz...
改成xrange应该会快上很多吧~
有错或有改进的地方还请务必告诉我 感恩~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.194.105.173