自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 后端
多數(shù)情況下,開發(fā)時間比性能更重要。Python有一個很棒的社區(qū),其中有很多很好的庫,很多需求在那都能得到滿足。話雖如此,如果想讓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)目中使用。

 

[[329476]]

 

 

圖源:morioh

 

安裝Cython

這需要C編譯器,你可以根據(jù)自己的操作系統(tǒng)安裝一個C編譯器,然后需要使用如下命令安裝Cython:

  1. pipinstall Cython 

從靜態(tài)類型聲明中獲益

可以將靜態(tài)類型聲明添加到變量和函數(shù),它將提供更好的性能。你可以將所有C類型如int,float,double等用于聲明。

在Cython中聲明變量

  1. cdef int i =10 

這句命令的基本意思是聲明一個變量i,它是一個整數(shù)。

在Cython中聲明函數(shù)

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

該命令基本上意味著square函數(shù)采用整數(shù)x作為參數(shù)并返回整數(shù)值x ** 2,即x的平方。導(dǎo)入模塊時,cdef聲明的函數(shù)對Python代碼不可見。為了使其可見需要改用cpdef。

在Python中計(jì)算階乘

編寫一個Python函數(shù)來計(jì)算給定整數(shù)的階乘:

  1. effactorial(n): 
  2.                        if  n >=1: 
  3.                            return n *factorial(n -1) 
  4.                        return1 

使用Cython讓Python更快

 

[[329477]]

 

 

圖源:unsplash

 

首先,要創(chuàng)建一個pyx文件。

cpdef longfastfactorial:此函數(shù)將返回一個long值,因此我們通過在函數(shù)名fastfactorial之前放置long來聲明它的類型為long。

long n:我們預(yù)期n為long值。

  1. cpdef long fastfactorial(long n): 
  2.                                 if  n >=1: 
  3.                                     return n * fastfactorial(n-1) 
  4.                                 return1 

接著,我們需要創(chuàng)建一個setup.py文件來將Cython轉(zhuǎn)換為C。

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

編譯代碼

為執(zhí)行編譯,需要運(yùn)行以下命令:

  1. python3setup.py build_ext –inplace 

--inplace:此選項(xiàng)會在你的工作目錄中創(chuàng)建一個共享對象文件。

對比

讓我們比較一下二者:

  1. from fastfac import fastfactorial 
  2.                    from fac import factorial 
  3.                    from timeit import timeit 
  4.                    
  5.                    print(timeit('fastfactorial(20)', globalsglobals=globals(), number=10000))  #output: 0.002164322999306023 
  6.                    print(timeit('factorial(20)', globalsglobals=globals(), number=10000))  #output: 0.18900858898996376 

結(jié)果驚人,Cython快將近88倍!

 

 

[[329478]]

 

 

圖源:unsplash

 

只需稍加潤色,就可使Python代碼的運(yùn)行速度大幅提高。本文還僅僅只是一個示例,你可以對其進(jìn)行進(jìn)一步優(yōu)化,效果可能會更好!

 

責(zé)任編輯:趙寧寧 來源: 讀芯術(shù)
相關(guān)推薦

2024-07-23 08:21:19

2023-12-07 19:13:48

Pythonprint

2025-02-05 08:54:36

rimrafNode.js工具

2018-02-25 09:12:15

PythonC語言代碼

2017-08-31 13:50:53

Python編程語言

2015-08-04 10:34:13

Windows 10升級

2022-06-17 11:10:43

PandasPolarsPython

2023-09-02 20:13:01

代碼網(wǎng)速

2022-01-06 08:34:32

數(shù)據(jù)庫Spark查詢

2012-12-11 09:48:55

廣域網(wǎng)網(wǎng)絡(luò)優(yōu)化網(wǎng)絡(luò)加速

2009-02-10 09:34:00

2020-07-23 14:15:42

Cython的Python代碼

2019-09-02 08:58:27

Python編譯器編程語言

2009-11-17 14:13:41

PythonGoogle

2019-05-16 14:50:32

CythonPython編程語言

2020-01-08 10:47:51

硬盤內(nèi)存網(wǎng)絡(luò)

2024-10-08 10:24:41

Python編程語言

2011-03-31 09:26:15

MySQL擴(kuò)展性精簡

2011-01-06 10:46:10

微軟認(rèn)證

2018-11-27 15:55:21

TCP通訊協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號