python作為一門(mén)強(qiáng)大的腳本語(yǔ)言,,優(yōu)勢(shì)自然不必說(shuō),目前中低頻的量化投資基本都是使用python作為research和production作為語(yǔ)言,。但是,,當(dāng)我們的模型較復(fù)雜,運(yùn)算量較大的時(shí)候,,python的短板就會(huì)出現(xiàn),,就是運(yùn)算速度慢。 當(dāng)然,,解決這一問(wèn)題有很多方法,,比如筆者先前提到的pypy的jit技術(shù),但是拋開(kāi)穩(wěn)定性不提,,使用pypy有很多限制,,而且不是那么工程化。所以,,從本文開(kāi)始,,筆者向大家介紹Cython的一系列文章,方便將來(lái)量化或者別的應(yīng)用場(chǎng)景中的一些重計(jì)算的部分單獨(dú)取出來(lái),,然后用Cython改寫(xiě),,獨(dú)立成模塊來(lái)提高運(yùn)算速度。 首先,,大家都知道,,C語(yǔ)言是編譯性語(yǔ)言,而Python則是解釋性語(yǔ)言,,簡(jiǎn)而言之,,就是Python運(yùn)行是逐行運(yùn)行,不需要實(shí)現(xiàn)編譯,,而C需要在運(yùn)行前編譯,。那么,可想而知,,如果運(yùn)行前,,需要事先編譯,那么其實(shí)有一種“上帝視角”的感覺(jué),,自然可以做很多優(yōu)化,,讓代碼運(yùn)行的更快。 而Cython的出現(xiàn)就是這個(gè)目的,,讓Python也可以被編譯,,然后執(zhí)行。大家要區(qū)別Cpython和Cython,,Cpython大家可以認(rèn)為是python的一種,,其實(shí)大家平時(shí)使用的基本都是cpython,。而Cython大家可以直接理解為一種語(yǔ)言,Cython是一種部分包含和改變C語(yǔ)言,,以及完全包含pyhton語(yǔ)言的一個(gè)語(yǔ)言集合,。學(xué)習(xí)一段時(shí)間后大家肯定會(huì)更加理解這句話。 我們先來(lái)過(guò)一下cython編寫(xiě)的流程吧,。 在寫(xiě)cython之前,,我們需要一個(gè)c編譯器,筆者目前使用的是win10,,不知道怎么的,,就是不能像以前win7一樣好好玩,所以直接在linux下面編譯了,。如果大家是windows平臺(tái),,需要先安裝一個(gè)專(zhuān)門(mén)為python準(zhǔn)備的編譯器,筆者的版本是2.7的,,鏈接如下: https://www.microsoft.com/en-us/download/confirmation.aspx?id=44266 然后就是測(cè)試一下流程了。首先我們要知道,,cython的文件后綴是.cyx,,而且既然cython是python語(yǔ)言的一個(gè)超集,那么,,cyx里面運(yùn)行純python文件也是沒(méi)有問(wèn)題的了,。 我們新建一個(gè)hello.pyx文件,在里面輸入
沒(méi)有任何特殊,,然后我們新建一個(gè)setup.py腳本,,這個(gè)python文件的目的就是使用cython編譯器去編譯pyx折一個(gè)cython文件。 setup文件的代碼很簡(jiǎn)單:
然后我們運(yùn)行一下setup文件,,python setup.py build_ext --inplace. build_est大概就是編譯extension文件的意思,,inplace則是放到源代碼pyx旁邊,也就是同一目錄下的意思,。 然后,,我們就可以看到多了兩個(gè)文件,一個(gè)是hello.c一個(gè)是hello.so(如果你是windows,,那么應(yīng)該是.pyd) 這里,,c文件就是cython將我們的pyx文件解析成一個(gè)c文件件,不依賴與平臺(tái),,而后面的so或者pyd文件,,則是將c文件進(jìn)行編譯后的一個(gè)文件,依賴于平臺(tái),。 這個(gè)時(shí)候,,so文件或者pyd文件就可以像普通的python文件一樣,,被import。 當(dāng)然,,每次如果都要這樣寫(xiě)個(gè)setup文件編譯一下,,其實(shí)挺麻煩的,還好cython給我們提供了一個(gè)很方便的解決方案,。 寫(xiě)完hello.pyx的cython代碼之后,,不需要編譯,當(dāng)我們需要使用的時(shí)候,,在文件前面加上
然后就可以了,。其實(shí),不是不用編譯了,,而是cython默默幫我們編譯好了,,放在其他地方罷了,對(duì)于我們使用者而言,,整體就簡(jiǎn)潔好的諾,。 這就是一個(gè)cython使用的初步,性能如何,,以及cython語(yǔ)法,,將在后面的部分中講述。 參考數(shù)據(jù):Cython A Guide for Python Programming |
|
來(lái)自: lichwoo > 《待分類(lèi)》