Python代碼加速利器:Cython

2021-03-02 專知

【導讀】如果你用過Python,你可能會發現它比想像中運行的慢,尤其是與C語言相比。這主要是因為Python是一種動態程式語言,然而C語言很多操作是在編譯時就完成了。但也不是沒有辦法,Cython可以很好解決你的痛點。

Cython是結合了Python和C的語法的一種語言,可以簡單的認為就是給Python加上了靜態類型後的語法,使用者可以維持大部分的Python語法,而不需要大幅度調整主要的程式邏輯與算法。但由於會直接編譯為二進位程序,所以性能較Python會有很大提升。雖然Cython本身是一種單獨的程式語言,但很容易將其整合到例如Jupyter筆記本工作流程。在執行時,Cython將您的Python代碼轉換為C,通常會大大加快它的速度。

安裝Cython

首先你需要你要C編譯器。對於Linux,通常使用GNU C編譯器(gncc)。對於Mac OS,您可以下載Xcode以獲取gncc。而Windows 桌面系統下安裝C編譯器會更複雜。

有了C編譯器之後,你只需運行:

如何使用Cython

我們將在IPython中演示Cython。

我們首先介紹IPython Magic命令。Magic命令以百分號開頭,通常有2種類型:

首先運行下列語句引入Cython:

然後,當運行Cython代碼時,我們需要加入以下Cython 代碼:

然後就可以愉快地使用Cython了。

Cython的速度有多快?

Cython 主要優化的是循環與遞歸。

讓我們用斐波那契數列來證明這一點。數列中下一個數字是前兩項之和,用如下代碼在Python中實現斐波那契數列:

def fibonacci(n):if n < 0:        print("1st fibonacci number = 0")elif n == 1:return 0elif n == 2:return 1else:return fibonacci(n-1) + fibonacci(n-2)

使用Python:

如上圖所示,在序列中找到第39個數字需要13.3秒。此處的掛起時間是指從調用該函數開始到結束所用的總時間。

讓我們在Cython中定義相同的函數。

其實只是在第一行加入了

加入「-a」之後,我們可以看出是Python中哪些代碼比較耗時了,加入「%%cython」 之後,這些代碼都將在C語言下運行。你還可以單擊每行旁邊的「+」符號以查看Python代碼的C轉換。

這段代碼有多快?我們來看看:

在這種情況下,Cython比Python快約6.75倍。這清楚地展示了利用Cython節省時間的能力,它提供了比常規Python代碼最大的改進。

其他選項

如果你熟悉C的使用,Cython還允許訪問C代碼,Cython的編寫者尚未添加即用型聲明。例如,使用以下代碼,您可以為C函數生成Python包裝器並將其添加到模塊dict中。

%%cythoncdef extern from "math.h":cpdef double sin(double x)

Cython還有許多其他功能,例如並行。

結論

如果您有時遇到不得不等待太長時間才能執行Python代碼的問題,Cython提供了一種非常整齊且高效的方法來加速您的代碼。最重要的是,如果您對C語言稍微熟悉,它提供了許多進一步優化代碼的功能。我絕對建議您仔細查看文檔。 

原文連結:

https://towardsdatascience.com/speed-up-your-python-code-with-cython-8879105f2b6f

-END-

專知,專業可信的人工智慧知識分發,讓認知協作更快更好!歡迎登錄www.zhuanzhi.ai,註冊登錄專知,獲取更多AI知識資料!

歡迎微信掃一掃加入專知人工智慧知識星球群,獲取最新AI專業乾貨知識教程視頻資料和與專家交流諮詢

請加專知小助手微信(掃一掃如下二維碼添加),加入專知人工智慧主題群,諮詢技術商務合作~

相關焦點

  • cython初體驗
    本文是筆者第一次使用cython的一個小結筆者最近參與了一個項目,其目的是提升一個python程序的運行速度。其中一個手段就是利用cython來優化原來的python代碼。筆者之前沒有接觸過cython,所以這次屬於在實踐中學習新知識。
  • 這個加速包讓Python代碼飛起來
    Cython就是用來加速純Python代碼的。 什麼是Cython? 從本質上講,Cython是Python和C/C++的橋梁。它允許你對Python代碼稍作修改,然後把Python代碼直接翻譯成C語言代碼。
  • 如何壓榨Cython及OpenMP優化Target Encoding
    最重要的一點就是我們需要先優化python代碼(算法複雜度),再去用cython(底層),最後才用並行(多線程多進程),不能本末倒置。這個時候,我覺得python代碼在我能力範圍內我覺得優化到不錯了,我想,是時候進行底層優化了(Cython)
  • 讓Python代碼更快運行的 5 種方法
    PyPy使用了Just-in-Time(JIT)即時編譯器,即動態編譯器,與靜態編譯器(如gcc,java等)不同,它是利用程序運行的過程的數據進行優化,擁有同谷歌Chrome V8 JavaScript引擎相同的語言加速技術。本月初,最新版本PyPy 2.5即將發布,此版本會有一系列的性能改進,提供更全面的如NumPy的支持,用於加速Python性能的共享庫。
  • Python 性能優化
    這個時候就該python的C擴展出馬了,C擴展就是把部分python代碼用C或者C++重新實現,然後編譯成動態連結庫,提供接口給其它python代碼調用。由於C語言的效率遠遠高於python代碼,所以使用C擴展是非常普遍的做法,比如我們前面提到的cProfile就是基於_lsprof.so的一層封裝。
  • 高性能Python:使用Cython
    本文分享自:http://blog.soliloquize.org/Cython安裝Cython可以通過pip直接進行安裝,pip install cythonCython代碼編譯與使用以一個簡短的代碼樣例來看下Cython如何使用,定義一個.pyx文件,
  • 10分鐘入門Cython
    www.zhihu.com/people/li_xiaowen/activities作者其他好文傳送門:協同過濾(ALS)的原理及Python實現回歸樹的原理及Python實現本文github:https://github.com/tushushu/flying-python
  • Cython 助力 Python NLP 實現百倍加速
    百倍加速第一步:代碼剖析你需要知道的第一件事情是,你的大部分代碼在純 Python 環境下可能都運行良好,但是其中存在一些瓶頸函數(Bottlenecks functions),一旦你能給予它們更多的「關照」,你的程序將獲得幾個數量級的提速。所以你應該從剖析自己的 Python 代碼開始,找出那些低效模塊。
  • 快100 倍,Python 為自然語言處理加速度!
    加速的第一步:性能分析首先要明確一點,絕大部分純 Python 的代碼是沒有問題的,但有幾個瓶頸函數如果能夠解決,就能給速度帶來數量級上的提升。現在,只需使用魔術命令(http://cython.readthedocs.io/en/latest/src/reference/compilation.html#compiling-with-a-jupyter-notebook)%%cython 就可以像寫 Python 代碼一樣寫 Cython 代碼了。
  • 快 100 倍,Python 為自然語言處理加速度!
    ('restats')p.sort_stats('cumulative').print_stats(30)也許你會發現有幾個循環比較慢,如果用神經網絡的話,可能有幾個 Numpy 數組操作會很慢(但這裡我不會討論如何加速 NumPy,已經有很多文章討論這個問題了:http://cython.readthedocs.io/en/latest/src/userguide
  • 量化交易之《Python數據分析》
    API,所以運算速度格外快3 與python標準的列表相比,Numpy數組使用的切片和索引方法更加高效。均值漂移算法:另外一種不需要估算聚類數的聚類算法遺傳算法:算法在搜索和優化方面用途廣泛,可以使用遺傳算法來搜索回歸問題或分類問題的最佳參數神經網絡決策樹  性能、功能、健壯性、可維護性、可測性、可用性性能分析:找出代碼中哪些部分比較慢,或者佔用內存比較多安裝Cython:cython
  • Cython 0.20 發布,Python 的 C 語言擴展
    實際上Cython的語法基本上跟Python一致,而Cython有專門的「編譯器」先將 Cython代碼轉變成C(自動加入了一大堆的C-Python API),然後使用C編譯器編譯出最終的Python可調用的模塊。Cython 0.20 發布了,詳細改進記錄如下:Support for CPython 3.4.
  • 如何讓Python腳本變成Windows應用
    學習網上資料後,準備用cython把py文件編譯成c文件,然後再用visual stuido裡的cl編譯成exe文件的方法。Cython轉換源py文件為.c文件cython -3 .建議裝個everything,如果系統提示你缺少xxxxx.h或xxxx.lib,去安裝vs2017和python的目錄,以及其他可能的相關目錄下找。
  • 專家課堂 | 人生苦短,我用Cython!論用Cython加速Python並行計算的實踐
    Cython結合了Python的易用性和原生代碼的速度,可以說是便捷性與高性能的完美融合。接下來,就請本期大數據專家——凌逍跟大家分享他使用Cython加速Python計算的實踐經驗。對於這種簡單而量大計算,multiprocessing多進程加速的效率很低。如下圖所示:
  • 商湯開源最大目標跟蹤庫PySOT,代碼已正式上線!
    當時PySOT並沒有上傳代碼,所以之前的文章僅介紹了新特性,但得到大家廣泛關注。本以為是2019年5月底會上線代碼,但於2019年5月13日凌晨,PySOT已正式上線代碼!PySOT 安裝&環境依賴Conda with Python 3.7.Nvidia GPU.PyTorch 0.4.1yacspyyamlmatplotlibtqdmOpenCV# Create environment and activateconda create--name pysot python
  • Python · numba 的基本應用
    雖然我用 Python 也有那麼兩年左右了,但也只能模模糊糊地感受到這麼兩點:* Python 太動態了* 如果能事先編譯一下 Python,讓它靜態一點,速度應該就會上來於是我們就有了 cython。然而 cython 畢竟不是原生的 Python 代碼,使用起來還是有諸多不便的。為此,numba 就成了一個功能強大又容易上手的替代選擇。
  • Numba:基於CUDA加速的高性能Python
    導致python如此流行的原因有很多,主要有其簡潔且易於理解的語法和標準的數據結構,廣泛的功能齊備的標準庫,優秀的文檔,庫和工具構成的良好的生態系統,專業支持的可用性以及大而開放的社區。也許最重要的是,像Python這樣的動態類型解釋語言的高效率。Python是靈活的,這使其成為可用於快速原型設計的一種很好的語言,同時也能用於構建完整的系統。
  • 如何利用並發性加速你的python程序(一):相關概念
    雷鋒網 AI 科技評論按,作為目前最流行的程式語言之一,python 在人工智慧相關的領域備受青睞。在編碼時,代碼的運行時間是我們需要考慮的重要因素之一。如何加快程序運行的速度?這是很多開發者經常會思考的問題。工程師 Jim Anderson 分享了他的經驗,他寫了一篇關於「通過並發性加快 python 程序的速度」的文章。
  • 谷歌又一開源利器Atheris,Python代碼安全掃描工具
    近日谷歌開源了一款Python代碼安全漏洞掃描工具Atheris,希望開發者在漏洞被利用之前能夠用它來發現安全漏洞並修補漏洞。pythonAtheris介紹Atheris目前基於Apache-2.0 License開源在github上,Atheris是一個典型的漏洞檢查工具
  • 如何讓Python像Julia一樣快地運行
    包含下面的所有基準測試的完整代碼的 Notebook 可在此處(https://www.ibm.com/developerworks/community/blogs/jfp/resource/julia_python.zip)找到。 鑑於各種社交媒體上的評論,我添加了這樣一句話:我沒有在這裡使用 Python 的替代性實現。我沒有編寫任何 C代碼:如果您不信,可試試尋找分號。