Re: [心得] 結合Python 與 C(C++) 的優點

看板Python作者 (阿真)時間16年前 (2009/04/14 01:39), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/7 (看更多)
: 我不知道你 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
文章代碼(AID): #19utZ4OL (Python)
討論串 (同標題文章)
文章代碼(AID): #19utZ4OL (Python)