摘要:起步由于在底層運算中會對每個運算做類型檢查這就影響了運行的性能,而利用擴展可以避免這樣的情況獲得優越的執行性能,利用提供的,如宏,類型,函數等來編寫擴展。測試更多關于模塊擴展內容
起步
由于python在底層運算中會對每個運算做類型檢查, 這就影響了運行的性能,而利用擴展, 可以避免這樣的情況, 獲得優越的執行性能,利用Python提供的C API,如宏,類型,函數等來編寫擴展。
前期準備此次編寫的環境為:
系統:Ubuntu 15.10
GCC:5.2.1
Python:2.7.10
環境版本不一致一般也不會有什么問題,確保已安裝python的開發包:sudo apt-get install python-dev
開始以下已判斷一個數是否為質數為例,py.c:
#include#include //有的是#include //判斷是否是質數 static PyObject *pr_isprime(PyObject *self, PyObject *args) { int n, num; //解析參數 if (!PyArg_ParseTuple(args, "i", &num)) { return NULL; } if (num < 1) { return Py_BuildValue("i", 0); //C類型轉成python對象 } n = num - 1; while (n > 1) { if (num % n == 0) return Py_BuildValue("i", 0); n--; } return Py_BuildValue("i", 1); } static PyMethodDef PrMethods[] = { //方法名,導出函數,參數傳遞方式,方法描述。 {"isPrime", pr_isprime, METH_VARARGS, "check if an input number is prime or not."}, {NULL, NULL, 0, NULL} }; void initpr(void) { (void) Py_InitModule("pr", PrMethods); }
以上代碼包含了3個部分:
導出函數:C模塊對外暴露的接口函數為pr_isprime,帶有self和args兩個參數,args包含了python解釋器要傳給c函數的所有參數,通常使用PyArg_ParseTuple()來獲得這些參數值。
初始化函數:一遍python解釋器能夠對模塊進行正確的初始化,初始化要以init開頭,如initp。
方法列表:提供給外部的python程序使用函數名稱映射表PrMethods,它是一個PyMethodDef結構體,成員依次是方法名,導出函數,參數傳遞方式,方法描述。
PyMethodDef原型:
struct PyMethodDef { char* ml_name; #方法名 PyCFunction ml_meth; #導出函數 int ml_flags; #參數傳遞方式 char* ml_doc; #方法描述 }
參數傳遞方式一般設置為METH_VARARGS,該結構體必須設置以{NULL, NULL, 0, NULL}表示一條空記錄作為結尾。
setup.py腳本為模塊寫一個安裝程序:
#!/usr/bin/env python # coding=utf-8 from distutils.core import setup, Extension module = Extension("pr", sources = ["py.c"]) setup(name = "Pr test", version = "1.0", ext_modules = [module])
使用python setup.py build進行編譯,系統會在當前目錄下生產一個build目錄,里面包含pr.so和pr.o文件。
安裝模塊下面三種方法任一種都可以:
將生產的pr.so復制到python的site_packages目錄下(我的是/usr/local/lib/python2.7/dist-packages,放到site_packages反而沒作用)。
或者將pr.so路徑添加到sys.path中。
或者用python setup.py install讓python完成安裝過程。
測試更多關于C模塊擴展內容:https://docs.python.org/2/c-a...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/40961.html
摘要:所以,最大的好處就是將腳本語言的開發效率和的運行效率有機的結合起來。前面的文章提到一個實現的雙數組的實現,它在中文分詞新詞發現等算法中的應用。本文以的封裝實現來說明的使用。編譯生成動態庫編譯生成的使用的,可以參考的編寫。 如果覺得文章對你有幫助,你也可以訪問老猿的個人博客https://www.yuanrenxue.com/ Python調用C/C++代碼的利器除了boost_pyt...
摘要:模塊中定義的全局變量只作用于該文件內部,不污染其他模塊。由純編寫的部分稱為內建模塊,例等模塊部分使用編寫。兼容多種模塊規范檢測是否為或者檢測是否為或環境定義為普通模塊將模塊執行結果掛載在對象下 1.為什么要CommonJS規范 javascript存在的缺點 沒有模塊系統 標準庫比較少 沒有標準接口 缺乏包管理系統 CommonJS規范的提出,彌補了javascript沒有標準的缺...
摘要:但是語言并沒有成功,究其原因,認為是其非開標識放造成的。已經成為最受歡迎的程序設計語言之一。年月,該語言作者在郵件列表上宣布將于年月日終止支持。其中很重要的一項就是的縮進規則。設計定位的設計哲學是優雅明確簡單。 文本標簽 換行標簽 -- br 是單標簽,意味著它沒有結束標簽。起強制換行作用 段落中的文字段落中的文字段落中的文字 水平分割線 -- hr 與br相同,也是單標簽??捎脕韰^分...
摘要:年月宣布支持時間延長到年。更詳細的發布列表參閱官網的版本號分為三段,形如。其中表示大版本號,一般當整體重寫,或出現不向后兼容的改變時,增加表示功能更新,出現新功能時增加表示小的改動如修復了某個,只要有修改就增加。年公司正式發布。 < 返回索引頁 Python語言簡介 Python介紹及發展 介紹 Python 官方網站:https://www.python.org/, 大家可以到此處下...
閱讀 3585·2021-11-18 13:20
閱讀 2735·2021-10-15 09:40
閱讀 1760·2021-10-11 10:58
閱讀 2126·2021-09-27 13:36
閱讀 2596·2021-09-07 10:06
閱讀 1857·2021-08-11 11:21
閱讀 1433·2019-08-29 17:04
閱讀 2088·2019-08-29 14:06