成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

初用C/C++擴展Python,提高性能

    前段時間寫了兩篇文章介紹如何提高Python的運行效率,一篇是從python語言本身的角度去介紹的,另一篇是從解釋器角度(利用PyPy),有興趣的可以找著看看。從另外一個角度來介紹如何提高python運行效率,那就是利用c/c++來擴展python提高性能。我們知道python官方網(wǎng)站上下載的python解釋器源碼是用c語言編寫的,所以,也可以利用c/c++來擴展它,以獲得較優(yōu)的執(zhí)行性能。Python提供了API接口,是我們很方便的能進行擴展,所有這些API都包含在Python.h的頭文件里,在編寫c代碼時引入該頭文件即可。下面來講講我初用c/c++擴展python的經(jīng)歷吧。申明所有系統(tǒng)Ubuntu 16.04 LTS。

成都創(chuàng)新互聯(lián)專注于漢源網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供漢源營銷型網(wǎng)站建設,漢源網(wǎng)站制作、漢源網(wǎng)頁設計、漢源網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務,打造漢源網(wǎng)絡公司原創(chuàng)品牌,更為您提供漢源網(wǎng)站排名全網(wǎng)營銷落地服務。

一)Ubuntu下如何編譯.c文件

    說實話,進行這部分學習時,第一困擾我的問題就是不知道怎么在Ubuntu下編譯.c文件,以前在大學的時候,用的是Windows系統(tǒng),安裝了visual studio 2010,代碼編寫,編譯都很方便。沒有在Ubuntu下用c語言開發(fā),所以這部分知道還不太了解,好在網(wǎng)上資料非常豐富,很快就能找到相應的資料。其實Ubuntu系統(tǒng)自帶c語言編譯器,那就是gcc。不信你可以打開終端,輸入命名:gcc --version,顯示如下信息:

初用C/C++擴展Python,提高性能

如果沒有的話,你也可自己安裝,安裝命令如下:

sudo apt-get install gcc

建議還要安裝一個build-essentiall包,作用是提供編譯程序必須軟件包的列表信息,也就是說 編譯程序有了這個軟件包它才知道 頭文件在哪 ,才知道庫函數(shù)在哪,還會下載依賴的軟件包 , 最后才組成一個開發(fā)環(huán)境。

好了,現(xiàn)在寫個簡單的.c文件吧。

打開終端,輸入命令vim hello.c,當然,你也可以用gedit來編輯代碼,只要文件擴展名不搞錯了就行。代碼如下:

#include<stdio.h>
int main()
{
int i;
for(i=0;i<3;i++)
printf("hello,gcc!\n");
}

然后保存文件并退出。編譯成可執(zhí)行文件,命令如下:

gcc hello.c -o hello

然后輸入./hello執(zhí)行該文件。效果如下圖。

初用C/C++擴展Python,提高性能

這里只是簡單的講了一下linux的gcc的使用方法,關于它更多的用法可以在網(wǎng)上查資料,在此不做過多介紹。

(二)使用C/C++擴展Python

1.先利用Python提供的接口,編寫一個漢語一定功能.c文件,比如判斷一個數(shù)是不是素數(shù)。在這里文件名為test.c,使用c語言實現(xiàn)后再使用Python進行包裝。代碼如下:

#include<Python.h>
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);
    }
    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 numbe is prime or not."},
    {NULL,NULL,0,NULL}
};

void initpr(void){
    (void) Py_InitModule("pr",PrMethods);
}

PyObject是Python對象機制的基礎,所有得對象都擁有一些相同的內(nèi)容,而這些內(nèi)容在PyObject中定義。

上面的代碼包括三部分:

一是導出函數(shù),C模塊對外暴露的接口函數(shù)pr_isprime,帶有self和args兩個參數(shù),其中參數(shù)args中包含了python解釋器要傳遞給c函數(shù)的所有參數(shù),通常使用PyArg_ParseTuple()來獲得這些參數(shù)。

二是初始化函數(shù),以便python解釋器能夠對模塊進行初始化,初始化時要以init開頭,如initx。

第三是方法列表,提供給外部的python程序使用的一個C模塊函數(shù)名稱映射表PrMethods。它是一個PyMethodDef結構體,其中成員依次表示方法名、導出函數(shù)、參數(shù)傳遞方式和方法描述。

參數(shù)傳遞方式一般設置為METH_VARARGS,如果想傳遞關鍵字參數(shù),你可以讓它與MRTH_KEYWORDS進行或運算;如果不想接受任何參數(shù),可以用METH_NOARGS,該結構體必須以{NULL,NULL,0,NULL}所表示的一條空記錄結尾。

至于為什么這樣做,可能與Python.h里面的函數(shù)有關,該部分我還未仔細研究,所以這篇文章也叫題目用了“初用”,如果有以后弄清楚了,我會“再用”,與大家分享學習經(jīng)驗。

2.編寫setup.py腳本

代碼如下:

rom distutils.core import setup,Extension
module = Extension('pr',sources=['test.c'])
setup(name='Pr test',version = '1.0',ext_modules=[module])

 distutils包是可以用來在Python環(huán)境中構建和安裝額外的模塊。新的模塊可以是純Python的,也可以是用C/C++寫的擴展模塊,或者可以是Python包,包中包含了由C和Python編寫的模塊。在此不做過多介紹,有興趣可以在網(wǎng)上找資料了解下。

3.使用python setup.py build進行編譯,系統(tǒng)會自動在當前目錄生成一個build子目錄,里面包含一個.so文件、.o文件??纯次业牟僮鹘Y果吧

初用C/C++擴展Python,提高性能

執(zhí)行python setup.py build命令后,系統(tǒng)確實在當前目錄生成了一個build子目錄,并且有一個.so文件、.o文件。

4.將生成的.so文件復制到/usr/local/lib/python2.7/dist-packages下,或者將.so文件所在目錄路徑添加到sys.path中,然后就可以使用該C擴展模塊了。如下圖:

初用C/C++擴展Python,提高性能

(三)簡單測試下性能

代碼如下:

#coding=utf-8
import pr
import datetime
def is_prime(n):
    if n <= 1:#
        return False
    else:
        a = n - 1
        while(a > 1):
            if n % a == 0:
                return True
            a = a - 1
        return False
t1 = datetime.datetime.now()
is_prime(8888888)
t2 = datetime.datetime.now()
pr.isPrime(8888888)
t3 = datetime.datetime.now()
print t3 - t2,t2 - t1

其中is_prime()是用python寫的判斷一個正數(shù)是不是素數(shù)。它的循環(huán)算法與pr模塊里面的isPrime()是一樣的,但是效率卻有很大差異,看看下圖運行結果。

初用C/C++擴展Python,提高性能

很顯然用c擴展的那個包里的函數(shù)計算速度快而且是塊近20倍,數(shù)值越大,速度上的差距越大,有興趣的話,可以動手試下。當然這只是一個定性分析。

網(wǎng)站標題:初用C/C++擴展Python,提高性能
文章起源:http://jinyejixie.com/article44/gggiee.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站、品牌網(wǎng)站設計、外貿(mào)建站、服務器托管、網(wǎng)站制作、網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
东源县| 手游| 霍邱县| 北辰区| 沂源县| 察隅县| 鹿泉市| 隆安县| 丰顺县| 彭泽县| 松滋市| 东海县| 虹口区| 莎车县| 修文县| 灵台县| 吉安县| 新巴尔虎右旗| 许昌县| 绍兴市| 施甸县| 英山县| 静安区| 綦江县| 顺平县| 安远县| 绥江县| 宁武县| 岳池县| 民勤县| 阜新市| 枣庄市| 崇仁县| 阳朔县| 保康县| 宜昌市| 文昌市| 凭祥市| 全州县| 仪征市| 宁津县|