10分鐘入門Cython

2021-02-21 Python愛好者社區

作者:李小文    算法工程師    Python愛好者社區專欄作者

知乎ID:https://www.zhihu.com/people/li_xiaowen/activities

作者其他好文傳送門:

協同過濾(ALS)的原理及Python實現

回歸樹的原理及Python實現

本文github:

https://github.com/tushushu/flying-python

1. Cython是什麼?

Cython是一個程式語言,它通過類似Python的語法來編寫C擴展並可以被Python調用.既具備了Python快速開發的特點,又可以讓代碼運行起來像C一樣快,同時還可以方便地調用C library。

2. 如何安裝Cython?

跟大多數的Python庫不同,Cython需要一個C編譯器,在不同的平臺上配置方法也不一樣。

2.1 配置gcc

windows
安裝MingW-w64編譯器:

conda install libpython m2w64-toolchain -c msys2
在Python安裝路徑下找到\Lib\distutils文件夾,創建distutils.cfg寫入如下內容:

macOS
安裝XCode即可 

linux: gcc一般都是配置好的,如果沒有就執行這條命令: 

sudo apt-get install build-essential

2.2 安裝cython庫3. 在Jupyter Notebook上使用Cython

%load_ext Cython
%%cython
cdef int a = 0
for i in range(10):
    a += i
print(a)

4. 試試Cython到底有多快

常規Python函數,運行時間559 ns

Cython def函數,聲明一個Python函數,既可以在模塊內調用,也可以在模塊外調用。模塊內運行時間524.2 ns,模塊外運行時間512 ns

Cython cpdef函數,聲明一個C函數和一個Python wrapper,在模塊內被當做C函數調用,在模塊外被.py文件當做Python函數調用。模塊內運行時間43.7 ns,模塊外運行時間81.7 ns

Cython cdef函數,聲明一個C函數,不可以在模塊外被Python調用。模塊內運行時間34.8 ns

4.1 常規Python函數

def f(x):
    return x ** 2 - x
%timeit f(100)

4.2 Cython def函數

%%cython
from time import time

def f1(x):
    return x ** 2 - x

n = 10000000
start = time()
for _ in range(n):
    f1(100)
end = time()
run_time = (end - start) / n * 1000 * 1000 * 1000
print("%.1f ns" % run_time)
%timeit f1(100)

4.3 Cython cpdef函數

%%cython
from time import time

cpdef long f2(long x):
    return x ** 2 - x

n = 10000000
start = time()
for _ in range(n):
    f2(100)
end = time()
run_time = (end - start) / n * 1000 * 1000 * 1000
print("%.1f ns" % run_time)
%timeit f2(100)

4.4 Cython cdef函數

%%cython
from time import time

cdef long f3(long x):
    return x ** 2 - x

n = 10000000
start = time()
for _ in range(n):
    f3(100)
end = time()
run_time = (end - start) / n * 1000 * 1000 * 1000
print("%.1f ns" % run_time)

5. 在Cython中使用Python對象

常規Python函數,運行時間549微秒

Python內置函數,運行時間104微秒

Cython函數,運行時間51.6微秒

5.1 常規Python函數

def sum_list(A):
    ret = 0
    for x in A:
        ret += x
    return ret
%timeit sum_list(A)

5.2 Python內置函數5.3 Cython函數

%%cython
cpdef int sum_list_cython(A):
    cdef int ret, x
    for x in A:
        ret += x
    return ret
%timeit sum_list_cython(A)

6. 在.pyx文件中使用Cython

from time import time

cdef long f4(long x):
    return x ** 2 - x

if __name__ == "__main__":
    cdef int x = 3
    print(f4(x))

參考文章

部分內容引用自 - Cython官方文檔

http://link.zhihu.com/?target=http%3A//docs.cython.org/en/latest/index.html

作者其他好文傳送門:

協同過濾(ALS)的原理及Python實現

回歸樹的原理及Python實現

Python的愛好者社區歷史文章大合集

Python的愛好者社區歷史文章列表

福利:文末掃碼關注公眾號,「Python愛好者社區」,開始學習Python課程:

關注後在公眾號內回復「 課程 」即可獲取:

小編的轉行入職數據科學(數據分析挖掘/機器學習方向)【最新免費】

小編的Python的入門免費視頻課程

小編的Python的快速上手matplotlib可視化庫!

崔老師爬蟲實戰案例免費學習視頻。

陳老師數據分析報告擴展製作免費學習視頻。

玩轉大數據分析!Spark2.X + Python精華實戰課程免費學習視頻。

相關焦點

  • cython初體驗
    本文是筆者第一次使用cython的一個小結筆者最近參與了一個項目,其目的是提升一個python程序的運行速度。其中一個手段就是利用cython來優化原來的python代碼。筆者之前沒有接觸過cython,所以這次屬於在實踐中學習新知識。
  • 如何壓榨Cython及OpenMP優化Target Encoding
    import cythoncimport cythonfrom cython.parallel import prange @cython.boundscheck(False)import cythoncimport cythonfrom cython.parallel import prange @cython.boundscheck(False)
  • Cython 0.20 發布,Python 的 C 語言擴展
    The new extension type decorator @cython.no_gc_clear preventsobjects from being cleared during cyclic garbage collection, thusmaking sure that object attributes are kept alive
  • Python代碼加速利器:Cython
    原文連結:https://towardsdatascience.com/speed-up-your-python-code-with-cython-8879105f2b6f-END-專知,專業可信的人工智慧知識分發,讓認知協作更快更好!歡迎登錄www.zhuanzhi.ai,註冊登錄專知,獲取更多AI知識資料!
  • 高性能Python:使用Cython
    本文分享自:http://blog.soliloquize.org/Cython安裝Cython可以通過pip直接進行安裝,pip install cythonCython代碼編譯與使用以一個簡短的代碼樣例來看下Cython如何使用,定義一個.pyx文件,
  • Matlab 10分鐘入門
    Matlab 語言Matlab語言是一種交互性的數學腳本語言,其語法與C/C++類似,下面列舉的教程可以幫我們快速的過一遍Matlab語法,非常適合入門。  % 不能是變量的具體值,同樣也不能是輸出變量  [V,D] = eig(A);  % 這條函數調用無法轉換成等價的指令語法  [~,D] = eig(A);  % 如果結果中只需要 D 而不需要 V 則可以這樣寫     % 邏輯運算  1 > 5  % 假,ans = 0  10
  • 10分鐘入門Keras : 兩種快速模型搭建方式
    正文共:3234 字 0 圖預計閱讀時間: 9 分鐘Keras 默認使用TensorFlow後端,使得神經網絡的搭建不會像
  • 10天15分鐘系列之Modeler入門教程(一)
    為了呼應各位程式設計師同行們學習數據挖掘的積極性,我們的小靈基於自己的學習經驗,錄製了一套實用性強的【免費Modeler入門教程】視頻資源,來幫助大家無壓力進入數據挖掘門檻。SPSS Modeler是一個適用於數據挖掘入門的工具,通過每天15分鐘的學習,結合案例實操,帶你系統掌握數據挖掘基本實現流程,比自學更有效率。
  • 《第一課》10分鐘學會吉他右手指法入門 看會六線譜 吉他教學
    《吉他輕鬆入門二十課》全課教學視頻系列-- 《第一課》10分鐘學會吉他右手指法入門 看會六線譜 吉他教學《吉他輕鬆入門二十課
  • 私房入門級小零食,10分鐘做好,酥脆又拉絲,沒有烤箱也能做
    牛軋餅乾可以說是一款私房入門級零食,做法很簡單,只要用到不粘鍋,10分鐘就能做好一盤,不需要用到烤箱。今天就給大家分享一下牛軋餅乾的做法,需要準備的食材有:椒鹽蘇打餅乾 40片,動物黃油 30克,棉花糖 90克,奶粉 25克,蔓越莓 30克。這裡大約能做20塊正方形的牛軋糖餅乾,正方形的餅乾可以換成圓形的或者長方形的。第一步:蔓越莓切成碎末,放一邊備用。
  • 小號10分鐘快速入門教程有效學習方法
    小號是西方銅管樂器之一,在中國民間由於小號只有三個按鍵又有稱作三音號,小號音色嘹亮,激情,聲音具有穿透力在管弦樂中起著關鍵作用,無論是合奏還是獨奏小號的音色總是給人振奮人心的感受,學會小號的基礎我們只需要10
  • 吉他快速入門教程10分鐘學彈曲子
    吉他快速入門教程1,認識吉他吉他由琴軸,琴弦,品格,琴箱,琴碼,撥片等基本組成,琴軸主要起到調節琴弦音準的功能,琴箱主要起到擴音放音作用。吉他快速入門教程2,吉他演奏姿勢吉他的演奏姿勢分為坐式和立式,坐式要挺胸抬頭,右腿打在做腿上或者,或者將琴箱放在右腿上,琴橫向傾斜為45度角,左手為按弦,右手為撥弦,左手按弦為指尖觸弦,左手觸弦時候注意手指度不要碰到其他弦,以免造成其他弦發音不實影響音色,按弦的位置要按在兩個品之間。
  • 新手入門篇:帶你10分鐘讀懂三大報表
    新手入門篇:10分鐘讀懂財務報表,其實很簡單財務報表,是每個財務人員無可避免都會接觸到日常工作,也是會計人員最頭疼的了,常常面對著複雜的財務報表無從下手,更別說做財務分析了,不少會計人員也正因為這樣,才一直停留在做帳報稅的層面,在公司無法得到更大的提升的空間。
  • 400分鐘,CorelDRAW2017入門基礎教程【視頻】
    01jiaocheng mulu這就是本套基礎教程的目錄:1.1 CDR初學創建文檔,保存,導入、導出 預覽等1.2 CDR基礎視頻對齊分布.順序.合併.群組.鎖定等1.3 CDR基礎視頻矢量繪圖工具圓,方,多邊形等1.4 CDR基礎視頻手繪.鋼筆.貝塞爾.藝術筆詳解
  • 60分鐘入門PyTorch
    Github 地址:https://github.com/pytorch/pytorch官網:https://pytorch.org/論壇:https://discuss.pytorch.org/本文是翻譯自官方版教程--DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ,一份 60 分鐘帶你快速入門
  • 《RWBY》手遊技巧盤點:三分鐘獵人速成班 從入門到入門
    因此本期的三分鐘獵人速成班,帶你三分鐘,從入門到入門!NO.1【不是月圓之夜,也會變身】《RWBY》中的部分BOSS在關卡當中,當滿足一定條件之後(例如血量低於一定狀態),就會變身。
  • MySQL環境配置和10分鐘快速入門
    本文中介紹的結構型資料庫MySQL的基礎知識,能夠讓你快速入門MySQL,具體內容包含:一、相關術語資料庫database:以某種有組織的方式存儲的數據集合。通常是一個文件或者一組文件。表table:結構化的文件,用來存儲某種特定類型的數據。存儲在表中的數據是同一種類型的數據或者清單。
  • 人生如戲,劇本如斯 3分鐘佔星入門教程
    終於到了入門系列的最後一篇「星座」。 星座是什麼?它是行星角色拿到的劇本,它決定了行星通過什麼樣的方式發揮能量。 入門階段無需馬上開始這種多要素的綜合理解,能夠熟練地把各元素兩兩組合進行基本釋義就已足夠。可以先從自己和周圍人的本命星盤開始。 最後強調一下,單點論可以用來幫助理解,但一定無法斷事。宮位、行星、相位、星座需要綜合起來才能讀出信息,這需要紮實的基礎理解和不斷的深思領悟。
  • 笛子入門知識三分鐘學會
    竹笛是我國絲竹管樂一種,由於竹笛音色優美,相對簡單易學深受廣大音樂愛好者喜歡,下面讓我們用三分鐘時間學會竹笛入門知識。最後要會認識一點簡譜,最簡便的識譜知道音高與節奏節拍,會打節奏節拍看著音符即可慢慢掌握樂曲演奏,在練習時候要保持平和心態切勿過激過燥,用心練習才會快速入門。