Re: [心得] 結合Python 與 C(C++) 的優點
: 我不知道你 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
討論串 (同標題文章)
Python 近期熱門文章
PTT數位生活區 即時熱門文章