如何將 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 的目錄,並在該目錄中建立一個副檔名為 .c 的檔案。假設檔名為 greet.c,現在在這個檔案中包含以下描述的標頭檔案。
#include <python.h> #include <string.h>
CPython 庫將提供 python.h 標頭檔案,並提供 many.py 擴充套件函式和型別。此庫幫助我們將 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"))
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP