嫌Python太慢了?讓Cython帶你飆車吧
本文轉(zhuǎn)載自公眾號“讀芯術(shù)”(ID:AI_Discovery)
很多人僅在性能方面將Python與C進(jìn)行了比較,沒有在快速開發(fā)方面比較,就開始抱怨Python太慢了。Python的優(yōu)點(diǎn)在于,其開發(fā)時間非常短,你不必處理指針、內(nèi)存管理等問題。
多數(shù)情況下,開發(fā)時間比性能更重要。Python有一個很棒的社區(qū),其中有很多很好的庫,很多需求在那都能得到滿足。
話雖如此,如果想讓Python代碼更快該怎么做呢?來試試Cython吧!
Cython: Python的C擴(kuò)展
如果你同時喜歡Python的簡單語法以及C的高性能,那么Cython就是你想要的。你可以使用Cython為Python編寫C擴(kuò)展,其代碼將轉(zhuǎn)換為優(yōu)化的C / C ++代碼。它可以提供高性能,且能在Python項(xiàng)目中使用。
安裝Cython
這需要C編譯器,你可以根據(jù)自己的操作系統(tǒng)安裝一個C編譯器,然后需要使用如下命令安裝Cython:
- pipinstall Cython
從靜態(tài)類型聲明中獲益
可以將靜態(tài)類型聲明添加到變量和函數(shù),它將提供更好的性能。你可以將所有C類型如int,float,double等用于聲明。
在Cython中聲明變量
- cdef int i =10
這句命令的基本意思是聲明一個變量i,它是一個整數(shù)。
在Cython中聲明函數(shù)
- cdef intsquare(int x):
- return x ** 2
該命令基本上意味著square函數(shù)采用整數(shù)x作為參數(shù)并返回整數(shù)值x ** 2,即x的平方。導(dǎo)入模塊時,cdef聲明的函數(shù)對Python代碼不可見。為了使其可見需要改用cpdef。
在Python中計(jì)算階乘
編寫一個Python函數(shù)來計(jì)算給定整數(shù)的階乘:
- effactorial(n):
- if n >=1:
- return n *factorial(n -1)
- return1
使用Cython讓Python更快
首先,要創(chuàng)建一個pyx文件。
cpdef longfastfactorial:此函數(shù)將返回一個long值,因此我們通過在函數(shù)名fastfactorial之前放置long來聲明它的類型為long。
long n:我們預(yù)期n為long值。
- cpdef long fastfactorial(long n):
- if n >=1:
- return n * fastfactorial(n-1)
- return1
接著,我們需要創(chuàng)建一個setup.py文件來將Cython轉(zhuǎn)換為C。
- from distutils.core import setup
- fromCython.Buildimport cythonize
- setup(ext_modules =cythonize('fastfac.pyx'))
編譯代碼
為執(zhí)行編譯,需要運(yùn)行以下命令:
- python3setup.py build_ext –inplace
--inplace:此選項(xiàng)會在你的工作目錄中創(chuàng)建一個共享對象文件。
對比
讓我們比較一下二者:
- from fastfac import fastfactorial
- from fac import factorial
- from timeit import timeit
- print(timeit('fastfactorial(20)', globalsglobals=globals(), number=10000)) #output: 0.002164322999306023
- print(timeit('factorial(20)', globalsglobals=globals(), number=10000)) #output: 0.18900858898996376
結(jié)果驚人,Cython快將近88倍!
只需稍加潤色,就可使Python代碼的運(yùn)行速度大幅提高。本文還僅僅只是一個示例,你可以對其進(jìn)行進(jìn)一步優(yōu)化,效果可能會更好!