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
留言列表