如何將C方法附加到現有的Python類?
我們目前正在編寫Python程式碼,其中使用了C方法。所有庫(例如NumPy、OpenCV、PyTorch等)的基礎都是用C和C++構建的,即這些庫內部呼叫編譯後的C程式碼,程式碼將在機器上執行,結果將返回到Python包裝器中。
為什麼我們在Python中使用C方法?
我們在Python中使用C方法的原因是效能。由於動態型別,Python的效能會下降。
在直譯器執行操作之前,它必須減少要傳遞的運算元的型別。這些型別的操作會影響程式的執行時間。
C模組允許我們檢查這些運算元並直接透過Python執行機器程式碼。
要使用C模組,我們必須將其與Python連結。將C模組與Python連結有多種方法。
一種方法是使用CPython API。要了解CPython API的工作原理和用法,使用此API的過程如下。
在Python中使用C API的過程
以下是使用Python中C API的步驟:
首先,我們必須安裝python3-dev包才能在Python中使用C方法。可以使用以下程式碼安裝該包。
pip install cpython
使用該程式碼後,我們必須建立一個名為extension的目錄,並在該目錄中建立一個副檔名為**extension.c**的檔案。假設該檔名為**greet.c**,現在在這個檔案中包含以下描述的標頭檔案。
#include <python.h> #include <string.h>
CPython庫將提供**python.h**標頭檔案,還提供許多擴充套件函式和型別。這個庫幫助我們整合Python和C。
示例
現在,讓我們建立一個程式來使用CPython庫。以下是可以用來使用CPython庫的程式碼。
static PyObject* name(PyObject *self, PyObject* args){
char *name;
char greeting[255] = "Hello ";
if (!PyArg_ParseTuple(args, "s", &name)){
return NULL;
}
strcat(greeting, name);
return Py_BuildValue("s", greeting);
}
在上面的程式碼中,我們使用了PyObject。PyObject是在C中表示的Python例項。此PyObject函式有兩個引數self和args。
self指示當前物件/模組
args用於指示Python引數。
定義我們的C方法
**PyArg_ParseTuple**傳遞到Python中,用於解釋C值。第二個引數中的s是一個字串值。如果是任何其他型別,它將在Python中丟擲型別錯誤。**Py_BuildValue**與**PyArg_ParseTuple**相反。這意味著它從C解釋Python中的值。
定義我們的C方法後,我們必須將其與Python介面。以下程式碼用於與Python進行解釋。
static PyMethodDef moduleMethods[] = {
{"name", name, METH_VARARGS, "Greets with your name"}
};
現在,在將我們的C方法與Python介面之後,我們必須定義模組型別。以下程式碼可用於定義模組型別。
static struct PyModuleDef greetModule = {
PyModuleDef_HEAD_INIT,
"greet",
"Greetings Module",
-1,
moduleMethods
};
PyMODINIT_FUNC PyInit_greet(void){
return PyModule_Create(&greetModule);
};
在當前程式中匯入方法
現在,在定義方法型別並建立方法後,我們必須將其匯入到我們的Python環境中。
import greet
print("Name: ", greet.__name__)
print("Docstring: ", greet.__doc__)
print("Greeting: ", greet.name("Lezwon"))
如果我們執行上述程式碼,將會收到nomodulefound錯誤。這是因為該模組尚未與Python連結。因此,必須完成以下設定才能在Python中使用用C語言建立的模組。
setuptools
首先,我們必須在Python環境中安裝setuptools。必須使用以下程式碼。
pip install setuptools
現在,我們必須使用Python擴充套件建立setup檔案。以下程式碼將用於該Python檔案中。
from setuptools import setup, Extension
ext_modules = [
Extension('greet', sources = ['greetmodule.c']),
]
setup(
name = 'Greeting Project',
ext_modules = ext_modules
)
在上面的程式碼中,我們使用了greet。這表示我們在C中建立的模組。要編譯我們的程式碼,我們必須使用以下命令。
python setup.py build_ext --inplace
現在我們可以執行以下程式碼。
import greet
print("Name: ", greet.__name__)
print("Docstring: ", greet.__doc__)
print("Greeting: ", greet.name("Lezwon"))
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP