Re: [心得] 結合Python 與 C(C++) 的優點
※ 引述《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
05/23 19:05, 1F
→
05/23 19:06, , 2F
05/23 19:06, 2F
推
05/23 19:11, , 3F
05/23 19:11, 3F
→
05/23 19:13, , 4F
05/23 19:13, 4F
→
05/24 20:02, , 5F
05/24 20:02, 5F
→
05/24 20:03, , 6F
05/24 20:03, 6F
→
05/24 20:03, , 7F
05/24 20:03, 7F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 7 之 7 篇):
Python 近期熱門文章
PTT數位生活區 即時熱門文章