cython 初探

 

自從我接觸python 之後,我就漸漸愛上他了,他沒有C語言的煩瑣,不管是排序還是找最大最小值都是一行程式碼就解決,曾經我看過一篇文章這麼的比喻C語言與python的不同,他說寫C語言就像拿著刀槍上戰場,但你必須時時的擔心刀會不會太利然後傷到自己或是槍會不會擦槍走火打到自己,有遇過莫名其妙C語言Bug的應該知道我在說啥,也就是說要用C語言解決問題之前你必須非常熟悉使用方式然後才是學用這工具解決問題,但是python不一樣,他代碼簡潔簡單易懂,你可以直接帶著這套裝備上戰場而不用特別著墨於武器的使用方式。

 

但是C語言還是有他的優點,也就是快速,這也是為什麼C語言歷久不衰的原因,python 開發快但是速度跑的慢,而C語言煩瑣開發慢但是速度跑的快,這也是python這種腳本語言的最大缺點,因此類似cython 這種語言就產生了,它的產生就是想既含有python代碼的簡潔性但是又有C語言的快速,他的運作方式是用 python 語法寫出來然後經過一些微微的修改(將參數宣告清楚 cdef def)就可以編譯成C語言,下面就來學習如何將 python 轉成 C 語言吧!!

step 1: 安裝 cython

sudo apt-get install cython

 

step 2: 寫程式吧,你沒看錯,對! 就是一行,然後存成helloworld.pyx檔

print "Hello"

step 3: 寫一個 setup.py 檔,等等轉換成C檔要用的

內容:

from distutils.core import setup
from Cython.Build import cythonize

setup(
   ext_modules = cythonize("helloworld.pyx")
)

step4 : 到資料夾位置運行以下命令

python setup.py build_ext --inplace

會產生出以下檔案

 

 

step5: 這時候就可以快速的引用囉

import helloworld   引用剛剛的檔案

這樣就出來了

這是 .C檔的樣貌

 

是不是很簡單呢~~~~

 

再來要測試其他程式,官網是用找質數當作測試,你也可以寫出你自己的程式來測試

Prime 測試

步驟跟剛剛的都一樣,只是內容不同

 

python 版本的找質數程式:

 

import numpy as np

import time

 

before = time.time()

 

def primes(kmax):

   

   result=[]

   p=[0 for i in range(1000)]

   

   if kmax > 1000:

       kmax = 1000

   k = 0

   n = 2

   while k < kmax:

       i = 0

       while i < k and n % p[i] != 0:

           i = i + 1

       if i == k:

           p[k] = n

           k = k + 1

           result.append(n)

       n = n + 1

   return result

 
 

test=primes(1000)

 

after = time.time()

 

print test

print "time: This is python\n",after - before

 

這是python找出前1000個質數的時間

 

Cython 版本的找質數程式:

 

pyx檔:

 

def primes(int kmax):

   cdef int n, k, i

   cdef int p[1000]

   result = []

   if kmax > 1000:

       kmax = 1000

   k = 0

   n = 2

   while k < kmax:

       i = 0

       while i < k and n % p[i] != 0:

           i = i + 1

       if i == k:

           p[k] = n

           k = k + 1

           result.append(n)

       n = n + 1

   return result

 

執行檔:

 

import time

import prime

 

before = time.time()

 

test= prime.primes(1000)

 

after = time.time()

 

print test

print "time: This is cython\n",after - before

 

這是cython 找出前1000個質數所需的時間

 

 

整整提升35倍阿!!!

 
 

C版本的找質數程式:

 

內容:

 

#include<stdio.h>

#include<stdlib.h>

#include <time.h>

 

int main()

{

  int n,k,i,j;

  int p[1000]={0};

  int result[1000]={0};

  clock_t before,after;    

  k=0;

  n=2;

  before = clock();

  while (k<1000)

  {

      i=0;

      while (i<k && n%p[i]!=0)

      {

          i=i+1;

      }

  if (i==k)

  {

     p[k]=n;

     k++;

     result[k-1]=n;

  }

  n++;

      

   }

 

  after = clock();

   

for (j=0;j<1000;j++)

printf("%d  ",result[j]);    

printf("\nseconds:%lf\n",(after-before)/(double)(CLOCKS_PER_SEC));

 

return 0;

}

 
 

儲存成prime.c檔 然後用GCC編譯

gcc prime.c -o prime

 
 

產生執行檔

 

執行~~

./prime

 

結果圖:

 

竟然是cython 比較快@@  有點出乎我意料之外

 

 

參考資料:

http://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html#language-details

arrow
arrow
    文章標籤
    cython
    全站熱搜
    創作者介紹
    創作者 Darwin的AI天地 的頭像
    Darwin的AI天地

    我的小小AI 天地

    Darwin的AI天地 發表在 痞客邦 留言(2) 人氣()