如何扩展NumPy电脑如何扩展c盘
編寫擴展模塊
雖然ndarray對象旨在允許在Python中進行快速計算,但它也被設計為通用的并且滿足各種各樣的計算需求。因此,如果絕對速度是必不可少的,那么就不能替換特定于您的應用程序和硬件的精心編制的循環。這是numpy包含f2py的原因之一,因此可以使用易于使用的機制將(簡單的)C / C ++和(任意)Fortran代碼直接鏈接到Python中。我們鼓勵您使用和改進此機制。本節的目的不是記錄此工具,而是記錄編寫此工具所依賴的擴展模塊的更基本步驟。
當擴展模塊被編寫,編譯并安裝到Python路徑(sys.path)中的某個位置時,可以將代碼導入到Python中,就好像它是標準的python文件一樣。它將包含已在C代碼中定義和編譯的對象和方法。在Python中執行此操作的基本步驟已有詳細記錄,您可以在www.python.org
上的在線文檔中找到更多信息。
除了Python C-API之外,NumPy還有一個完整而豐富的C-API,允許在C級上進行復雜的操作。但是,對于大多數應用程序,通常只使用少量API調用。如果你需要做的就是提取一個指向內存的指針以及一些形狀信息以傳遞給另一個計算例程,那么你將使用非常不同的調用,然后如果你試圖創建一個類似于數組的新類型或添加一個新數據ndarrays的類型。本章介紹了最常用的API調用和宏。
必需的子程序
必須在C代碼中定義一個函數才能使Python將其用作擴展模塊。該函數必須被稱為init {name},其中{name}是Python中模塊的名稱。必須聲明此函數,以便對例程外部的代碼可見。除了添加您想要的方法和常量之外,此子例程還必須包含調用import_array()
和/或import_ufunc()取決于需要哪個C-API。只要實際調用任何C-API子例程,忘記放置這些命令就會將自身顯示為一個丑陋的分段錯誤(崩潰)。實際上,在單個文件中可以有多個init {name}函數,在這種情況下,該文件將定義多個模塊。但是,有一些技巧可以讓它正常工作,這里沒有涉及。
一個最小的init{name}方法看起來像:
PyMODINIT_FUNCinit{name}(void){ (void)Py_InitModule({name}, mymethods); import_array();}
mymethods必須是PyMethodDef結構的數組(通常是靜態聲明的),它包含方法名,實際的C函數,指示方法是否使用關鍵字參數的變量,以及docstrings。這些將在下一節中介紹。如果要向模塊添加常量,則存儲Py_InitModule的返回值,Py_InitModule是一個模塊對象。向模塊添加項目的最常用方法是使用PyModule_GetDict(模塊)獲取模塊字典。使用模塊字典,您可以手動將任何您喜歡的內容添加到模塊中。向模塊添加對象的更簡單方法是使用三個額外的Python C-API調用之一,這些調用不需要單獨提取模塊字典。這些內容記錄在Python文檔中,但為方便起見,在此處重復:
int PyModule_AddObject(PyObject
*module,char *name,PyObject
* value )?
int PyModule_AddIntConstant(PyObject
* module ,char * name ,long value )?
int PyModule_AddStringConstant(PyObject
* module ,char * name ,char * value )?
所有這三個函數都需要 模塊 對象(Py_InitModule的返回值)。該 名稱 是標簽模塊中的值的字符串。根據調用的函數, value 參數是一般對象(PyModule_AddObject竊取對它的引用),整數常量或字符串常量。
定義函數
傳遞給Py_InitModule函數的第二個參數是一個結構,可以很容易地在模塊中定義函數。在上面給出的示例中,mymethods結構將在文件的早期(通常在init {name}子例程之前)定義為:
。。。。。。。。。。。。。
作者:柯廣
篇幅有限更多請見擴展鏈接:http://www.mark-to-win.com/tutorial/52203.html
總結
以上是生活随笔為你收集整理的如何扩展NumPy电脑如何扩展c盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开关电源的基础工作原理开关电源电路原理详
- 下一篇: 关闭危险端口电脑135端口如何关闭