Ctypes模組實現python加速執行

2021-09-29 17:07:24 字數 1786 閱讀 8414

一、我們以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又是 來的呢...