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