一、我們以fibonacci數列的例子來看看,python的執行時間
def fibonacci(n):
if n <= 2:
return 1
else:
return fibonacci(n - 1) + fibonacci(n - 2)
begin = time.time()
print(fibonacci(40))
over = time.time()
print(over - begin)
linux環境執行的時間為16.93秒:(window下會更長)
二、我們來介紹ctypes模組
python內建ctypes庫使用了各個平台動態載入動態鏈結庫的方法,並在python源生**基礎上通過型別對映方式將python與二進位制動態鏈結庫相關聯,實現python與c語言的混合程式設計,可以很方便地呼叫c語言動態鏈結庫中的函式。(ctypes原始碼路徑:/modules/_ctypes/_ctypes.c、/modules/_ctypes/callproc.c)
將c編寫的遞迴函式存為fibonacci.c,不需要對c函式經過python介面封裝
#include #include int fibonacci(int n)
在linux環境下fibonacci.c編譯成動態鏈結庫fibonacci.so:
編譯命令為:
python檔案中呼叫動態鏈結庫a.so,在windows平台下,最終呼叫的是windows api中loadlibrary函式和getprocaddress函式,在linux和mac os x平台下,最終呼叫的是posix標準中的dlopen和dlsym函式。ctypes庫內部完成pyobject* 和c types之間的型別對映,使用時只需設定呼叫引數和返回值的轉換型別即可。
利用fibonacci.so來求fibonacci數列後的python**
import time
from ctypes import cdll
libb = cdll.loadlibrary('./fibonacci.so')
def fibonacci_c(n):
return libb.fibonacci(n)
begin = time.time()
print(fibonacci_c(40))
over = time.time()
print(over-begin)
執行結果如下,利用動態鏈結庫的形式計算第40個fibonacci數列的值,只用了0.47秒:
對比兩次的執行結果:
直接用python**來編寫和利用動態鏈結庫的形式,時間提高了差不多提高了35倍
三、當然除了利用ctypes模組結合動態庫的形式提速,還可以利用python中擴充套件c語言加快執行速度的實現python的加速
Python之ctypes模組用法
目錄 簡要說明 開發環境 封裝資料結構 陣列 結構體 指標 列舉 函式傳遞結構體引數 備註 ctypes是python的外部函式庫。它提供c相容的資料型別,並允許在dll或共享庫中呼叫函式,它可以用於在純python中包裝這些庫。cdll 載入使用標準cdecl呼叫約定匯出函式的庫,而windll庫...
python使用ctypes呼叫擴充套件模組的例項方法
楔子 我們知道python的執行效率不是很高,而且由於gil的原因,導致python不能充分利用多核cpu。一般的解決方式是使用多程序,但是多程序開銷比較大,而且程序之間的通訊也會比較麻煩。因此在解決效率問題上,我們會把那些比較耗時的模組使用c或者c 編寫,然後編譯成動態鏈結庫,windows上面是...
如何把idaapi模組在外部給python使用
使用ida都知道idapython外掛程式,提供idc.py idaapi.py idautils.py,可以直接import進來,可以在ida執行時使用內部python外掛程式執行 然而這幾個函式在不使用ida上下文的時候是無法使用的,會提示找不到 idaapi模組,那麼 idaapi又是 來的呢...