成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

使用C/C++編寫(xiě)Python模塊擴(kuò)展

Aklman / 3543人閱讀

摘要:起步由于在底層運(yùn)算中會(huì)對(duì)每個(gè)運(yùn)算做類型檢查這就影響了運(yùn)行的性能,而利用擴(kuò)展可以避免這樣的情況獲得優(yōu)越的執(zhí)行性能,利用提供的,如宏,類型,函數(shù)等來(lái)編寫(xiě)擴(kuò)展。測(cè)試更多關(guān)于模塊擴(kuò)展內(nèi)容

起步

由于python在底層運(yùn)算中會(huì)對(duì)每個(gè)運(yùn)算做類型檢查, 這就影響了運(yùn)行的性能,而利用擴(kuò)展, 可以避免這樣的情況, 獲得優(yōu)越的執(zhí)行性能,利用Python提供的C API,如宏,類型,函數(shù)等來(lái)編寫(xiě)擴(kuò)展。

前期準(zhǔn)備

此次編寫(xiě)的環(huán)境為:

系統(tǒng):Ubuntu 15.10

GCC:5.2.1

Python:2.7.10

環(huán)境版本不一致一般也不會(huì)有什么問(wèn)題,確保已安裝python的開(kāi)發(fā)包:sudo apt-get install python-dev

開(kāi)始

以下已判斷一個(gè)數(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對(duì)象
    }

    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個(gè)部分:

導(dǎo)出函數(shù):C模塊對(duì)外暴露的接口函數(shù)為pr_isprime,帶有self和args兩個(gè)參數(shù),args包含了python解釋器要傳給c函數(shù)的所有參數(shù),通常使用PyArg_ParseTuple()來(lái)獲得這些參數(shù)值。

初始化函數(shù):一遍python解釋器能夠?qū)δK進(jìn)行正確的初始化,初始化要以init開(kāi)頭,如initp。

方法列表:提供給外部的python程序使用函數(shù)名稱映射表PrMethods,它是一個(gè)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腳本

為模塊寫(xiě)一個(gè)安裝程序:

#!/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進(jìn)行編譯,系統(tǒng)會(huì)在當(dāng)前目錄下生產(chǎn)一個(gè)build目錄,里面包含pr.so和pr.o文件。

安裝模塊

下面三種方法任一種都可以:

將生產(chǎn)的pr.so復(fù)制到python的site_packages目錄下(我的是/usr/local/lib/python2.7/dist-packages,放到site_packages反而沒(méi)作用)。

或者將pr.so路徑添加到sys.path中。

或者用python setup.py install讓python完成安裝過(guò)程。

測(cè)試

更多關(guān)于C模塊擴(kuò)展內(nèi)容:https://docs.python.org/2/c-a...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/40961.html

相關(guān)文章

  • PythonC/C++擴(kuò)展——用SWIG封裝C++為Python模塊

    摘要:所以,最大的好處就是將腳本語(yǔ)言的開(kāi)發(fā)效率和的運(yùn)行效率有機(jī)的結(jié)合起來(lái)。前面的文章提到一個(gè)實(shí)現(xiàn)的雙數(shù)組的實(shí)現(xiàn),它在中文分詞新詞發(fā)現(xiàn)等算法中的應(yīng)用。本文以的封裝實(shí)現(xiàn)來(lái)說(shuō)明的使用。編譯生成動(dòng)態(tài)庫(kù)編譯生成的使用的,可以參考的編寫(xiě)。 如果覺(jué)得文章對(duì)你有幫助,你也可以訪問(wèn)老猿的個(gè)人博客https://www.yuanrenxue.com/ Python調(diào)用C/C++代碼的利器除了boost_pyt...

    鄒強(qiáng) 評(píng)論0 收藏0
  • nodejs筆記-模塊機(jī)制

    摘要:模塊中定義的全局變量只作用于該文件內(nèi)部,不污染其他模塊。由純編寫(xiě)的部分稱為內(nèi)建模塊,例等模塊部分使用編寫(xiě)。兼容多種模塊規(guī)范檢測(cè)是否為或者檢測(cè)是否為或環(huán)境定義為普通模塊將模塊執(zhí)行結(jié)果掛載在對(duì)象下 1.為什么要CommonJS規(guī)范 javascript存在的缺點(diǎn) 沒(méi)有模塊系統(tǒng) 標(biāo)準(zhǔn)庫(kù)比較少 沒(méi)有標(biāo)準(zhǔn)接口 缺乏包管理系統(tǒng) CommonJS規(guī)范的提出,彌補(bǔ)了javascript沒(méi)有標(biāo)準(zhǔn)的缺...

    lscho 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----HTML網(wǎng)頁(yè)設(shè)計(jì)<二>

    摘要:但是語(yǔ)言并沒(méi)有成功,究其原因,認(rèn)為是其非開(kāi)標(biāo)識(shí)放造成的。已經(jīng)成為最受歡迎的程序設(shè)計(jì)語(yǔ)言之一。年月,該語(yǔ)言作者在郵件列表上宣布將于年月日終止支持。其中很重要的一項(xiàng)就是的縮進(jìn)規(guī)則。設(shè)計(jì)定位的設(shè)計(jì)哲學(xué)是優(yōu)雅明確簡(jiǎn)單。 文本標(biāo)簽 換行標(biāo)簽 -- br 是單標(biāo)簽,意味著它沒(méi)有結(jié)束標(biāo)簽。起強(qiáng)制換行作用 段落中的文字段落中的文字段落中的文字 水平分割線 -- hr 與br相同,也是單標(biāo)簽??捎脕?lái)區(qū)分...

    jiekechoo 評(píng)論0 收藏0
  • Python入門(mén)-Python簡(jiǎn)介

    摘要:年月宣布支持時(shí)間延長(zhǎng)到年。更詳細(xì)的發(fā)布列表參閱官網(wǎng)的版本號(hào)分為三段,形如。其中表示大版本號(hào),一般當(dāng)整體重寫(xiě),或出現(xiàn)不向后兼容的改變時(shí),增加表示功能更新,出現(xiàn)新功能時(shí)增加表示小的改動(dòng)如修復(fù)了某個(gè),只要有修改就增加。年公司正式發(fā)布。 < 返回索引頁(yè) Python語(yǔ)言簡(jiǎn)介 Python介紹及發(fā)展 介紹 Python 官方網(wǎng)站:https://www.python.org/, 大家可以到此處下...

    Java_oldboy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<