嫌Python太慢了?讓Cython帶你飆車吧

全文共1062字,預計學習時長6分鐘

圖源:unsplash

很多人僅在效能方面將Python與C進行了比較,沒有在快速開發方面比較,就開始抱怨Python太慢了。Python的優點在於,其開發時間非常短,你不必處理指標、記憶體管理等問題。

多數情況下,開發時間比效能更重要。Python有一個很棒的社群,其中有很多很好的庫,很多需求在那都能得到滿足。

話雖如此,如果想讓Python程式碼更快該怎麼做呢?來試試Cython吧!

Cython: Python的C擴充套件

如果你同時喜歡Python的簡單語法以及C的高效能,那麼Cython就是你想要的。你可以使用Cython為Python編寫C擴充套件,其程式碼將轉換為最佳化的C / C 程式碼。它可以提供高效能,且能在Python專案中使用。

圖源:morioh

安裝Cython

這需要C編譯器,你可以根據自己的作業系統安裝一個C編譯器,然後需要使用如下命令安裝Cython:

pipinstall Cython

從靜態型別宣告中獲益

可以將靜態型別宣告新增到變數和函式,它將提供更好的效能。你可以將所有C型別如int,float,double等用於宣告。

在Cython中宣告變數

cdef int i =10

這句命令的基本意思是宣告一個變數i,它是一個整數。

在Cython中宣告函式

cdef intsquare(int x):
return x ** 2

該命令基本上意味著square函式採用整數x作為引數並返回整數值x ** 2,即x的平方。匯入模組時,cdef宣告的函式對Python程式碼不可見。為了使其可見需要改用cpdef。

在Python中計算階乘

編寫一個Python函式來計算給定整數的階乘:

effactorial(n):
if n >=1:
return n *factorial(n -1)
return1

使用Cython讓Python更快

圖源:unsplash

首先,要建立一個pyx檔案。

cpdef longfastfactorial:此函式將返回一個long值,因此我們透過在函式名fastfactorial之前放置long來宣告它的型別為long。

long n:我們預期n為long值。

cpdef long fastfactorial(long n):
if n >=1:
return n * fastfactorial(n-1)
return1

接著,我們需要建立一個setup.py檔案來將Cython轉換為C。

from distutils.core import setup
fromCython.Buildimport cythonize
setup(ext_modules =cythonize('fastfac.pyx'))

編譯程式碼

為執行編譯,需要執行以下命令:

python3setup.py build_ext –inplace

--inplace:此選項會在你的工作目錄中建立一個共享物件檔案。

對比

讓我們比較一下二者:

from fastfac import fastfactorial
from fac import factorial
from timeit import timeit
print(timeit('fastfactorial(20)', globals=globals(), number=10000)) #output: 0.002164322999306023
print(timeit('factorial(20)', globals=globals(), number=10000)) #output: 0.18900858898996376

結果驚人,Cython快將近88倍!

圖源:unsplash

只需稍加潤色,就可使Python程式碼的執行速度大幅提高。本文還僅僅只是一個示例,你可以對其進行進一步最佳化,效果可能會更好!

版權宣告:本文源自 網路, 於,由 楠木軒 整理釋出,共 1609 字。

轉載請註明: 嫌Python太慢了?讓Cython帶你飆車吧 - 楠木軒