我是NumPy 的C 擴展的新手,我想知道以下作業流程是否可行。
- 在 NumPy 中預分配一個陣列
- 將此陣列傳遞給 C 擴展
- 在 C 中就地修改陣列資料
- 在標準 NumPy 函式中使用 Python 中更新的陣列
特別是,我想這樣做,同時確保我在任何步驟都制作零個新的資料副本。
我熟悉的C面的樣板,如PyModuleDef,PyMethodDef和PyObject*論點,但很多我見過的涉及強迫到我的理解涉及復制和/或鑄件C陣列的例子。我也知道 Cython,但我不知道它是否在引擎蓋下進行了類似的強制或復制。我對ndarray使用數字(例如int32)值進行的簡單索引獲取和設定操作特別感興趣。
有人可以提供一個創建 NumPy 陣列、在 C 擴展中就地修改它并隨后在 Python 中使用結果的最小作業示例嗎?
uj5u.com熱心網友回復:
Cython 不會創建 numpy 陣列的新副本,除非您使用 numpy 函式特別要求它這樣做,因此它在處理 numpy 陣列時盡可能高效,請參閱使用 NumPy
在撰寫原始 C 模塊和使用 cython 之間進行選擇取決于撰寫模塊的目的。如果您正在撰寫一個僅由 python 使用的模塊來盡快使用 numpy 陣列執行非常小的特定任務,那么一定要使用 cython,因為它會自動正確注冊模塊并處理記憶體并防止人們在撰寫 C 代碼時犯的常見錯誤(如記憶體管理問題),以及自動化編譯器包含并允許更輕松地訪問復雜的功能(如使用 numpy 迭代器)。
但是,如果您的模塊要在其他語言中使用并且必須獨立于 python 運行并且必須在沒有任何開銷的情況下與 python 一起使用,并且實作了一些復雜的 C 資料結構并需要大量的 C 功能,那么一定要創建你自己的 C 擴展(甚至是一個 dll),你可以從 python 傳遞指向 numpy 陣列的指標(使用numpy.ctypeslib.as_ctypes_type),或者傳遞 python 物件本身并回傳它(但你必須創建一個 .pyd/so dll),或者甚至在 C 端創建 numpy 陣列并由 python 管理它(但你必須了解numpy C API)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/389939.html
標籤:Python 数组 麻木的 python-c-api
下一篇:在資料框中找到最接近的值?
