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

看板Python作者 (渴望平凡的幸福)時間16年前 (2009/05/22 17:57), 編輯推噓2(205)
留言7則, 2人參與, 最新討論串7/7 (看更多)
※ 引述《KSJ (阿真)》之銘言: : 1.很正規的寫法 : 把py_XYTZseq中第i個 py_數值(xdata) : 轉成 py_float(fxdata) : 再轉成c_double 存入 Xseq[j] : 然後再把有new reference(新)的pyobject都decref掉 : PyObject *xdata = PySequence_Fast_GET_ITEM(XYTZseq, i); //借 : PyObject *fxdata = PyNumber_Float(xdata); //新 : Xseq[j] = PyFloat_AS_DOUBLE(fxdata); //無 : Py_DECREF(xdata); 這樣子很 ok 但是想用 PyNumber_Float() 多做一次轉換的話, 應該也會想檢查轉出來的東西有沒有變 NULL 才對 ... : 2.做的事都一樣 : PyObject *xdata = PySequence_Fast_GET_ITEM(XYTZseq, i); //借 : xdata = PyNumber_Float(xdata); //新 : //^^^^^^此處xdata 指向原來的自己 : //不知道會不會出什麼問題 : Xseq[j] = PyFloat_AS_DOUBLE(xdata); : Py_DECREF(xdata); 這個版本也 ok, 反正 xdata 本來就是 borrowed reference, 不必特別打理 : 3.把所有的東西寫成一行 : Xseq[j] = //(bbs不夠寬換行一下) : PyFloat_AS_DOUBLE(PyNumber_Float(PySequence_Fast_GET_ITEM(XYTZseq, i))) : 裡面都沒有指定"間接"的py_object去接中途所算的值 : 那這樣並沒有任何"東西"reference+1嗎?? 這樣不行, PyNumber_Float 生出來的新物件沒釋放掉 有可能變成 memory leak (我不確定會不會被 garbage collector 抓到, 最好不要冒險) 總之 PyNumber_Float() 會生一個新物件出來, 用完必須自己打理掉 最好檢查一下 NULL, 考慮要不要改用 Py_XDECREF ... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.120.15.14

05/23 19:05, , 1F
非常感謝 第一個不檢查是因為能確定是number(讀字串再轉浮點)
05/23 19:05, 1F

05/23 19:06, , 2F
還是說 確定的話 連PyNumber_Float 都不用了 直接轉double?
05/23 19:06, 2F

05/23 19:11, , 3F
第一個例子最後 應該是de掉fxdata才是吧? 我筆誤了抱歉orz
05/23 19:11, 3F

05/23 19:13, , 4F
不過如果以筆誤執行 好像RC也會"剛好"消失 是嗎@_@??
05/23 19:13, 4F

05/24 20:02, , 5F
確定的話應該可以直接 PyFloat_AS_DOUBLE ...
05/24 20:02, 5F

05/24 20:03, , 6F
對, 看錯了, 要 de 掉 fxdata, 不能刪 xdata O_O
05/24 20:03, 6F

05/24 20:03, , 7F
刪 xdata 的話, 之後去看那個 seq 就有可能會爆
05/24 20:03, 7F
文章代碼(AID): #1A5dS9cH (Python)
文章代碼(AID): #1A5dS9cH (Python)