溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python擴展模塊加速方案的示例分析

發(fā)布時間:2021-09-13 11:04:41 來源:億速云 閱讀:147 作者:小新 欄目:開發(fā)技術

這篇文章主要介紹Python擴展模塊加速方案的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

ctypes(一)

 — 初識

 很多初學Python的新手,總是嘴邊掛著一句話:“Python是一門膠水語言”。

可是究竟什么是膠水語言呢?相信很多人都不知道,或者誤以為膠水就是可以直接和其他所有語言配合的語言。

雖然如今Python已經(jīng)發(fā)展得很強大了,“膠水語言”這個特性已經(jīng)很少被提及了。但是膠水仍然是它現(xiàn)在應用得最廣泛的特性之一。只不過從曾經(jīng)Python為輔變成了如今的Python為主而已。

那么到底什么是“膠水特性”呢?

其實Python自打出生以來就和C語言有莫大的關聯(lián),它可以調(diào)用現(xiàn)有的C/C++程序,而不用做那些重復造輪子的事。使得節(jié)約了大量的重新開發(fā)的成本。許多的現(xiàn)有C程序代碼可以用一個Python作為中樞來管理和調(diào)用,就好像這些C程序“被膠水粘住了”一樣。這就是膠水特性的來源。

隨著Python語言的發(fā)展,Python已經(jīng)變得足夠強大和健壯,在不斷優(yōu)化性能的過程中,膠水這一特性被逐漸弱化,因為Python已經(jīng)強大到不需要依附C語言而存在。但是這一特性讓然被保留了下來。那么,既然Python已經(jīng)足夠強大,那么還需要這一特性做什么呢?

說到底,Python是一個解釋型動態(tài)腳本語言,再加上十幾年沒有解決的GIL鎖,無論是執(zhí)行效率還是并發(fā)性都是Python最大的缺點。

因此這個特性的存在給如今的Pythoner一個新的選擇,那些對執(zhí)行效率和并發(fā)性有著極高要求的模塊,使用C來實現(xiàn)。使用C來輔助Python解決某些特殊情況下的性能問題,成了如今Python社區(qū)中最為普遍的方案,很多人不知道,事實上很多我們常用的庫都利用了這一特性。

數(shù)據(jù)兼容層

由于Python這一特性是一個大家族,我們先來了解一下Python與C之間做的一個兼容層模塊 — ctypes 模塊。

了解 ctypes模塊之前,我們需要先了解 ctypes 提供了哪些用于兼容的數(shù)據(jù)類型:

注:一下表格是根據(jù)Python3版本列出,區(qū)別僅僅是原生字符串類型和long整型而已

Python擴展模塊加速方案的示例分析

Python擴展模塊加速方案的示例分析

嘗試共享庫

什么是共享庫?

其實C語言在經(jīng)過編譯之后不一定要生成可執(zhí)行文件,可以以一種共享給其他程序調(diào)用的“共享庫”的形式存在,其他程序通過調(diào)用這個共享庫,就可以利用這個現(xiàn)有C編譯過的程序了。

為了對各位新手朋友能夠更加產(chǎn)生更加直接的幫助,我們以Windows系統(tǒng)為例,調(diào)用VC共享庫。Windows下默認給VC共享庫加上dll擴展名后綴。

我們以加載 cdecl 調(diào)用規(guī)則函數(shù)的 cdll 模塊進行展示

首先,我們必須要導入 cdll 可以參考一下語句

from ctypes import cdll

然后可以直接通過對 cdll 的屬性訪問獲得 msvcrt.dll 共享庫文件的連接

libc = cdll.msvcrt

接著,我們就可以從這個共享庫中獲得相應的VC函數(shù)了,最常見的是printf函數(shù)(ps:不知道有沒有引起一些老司機的眼淚呢?)

printf = libc.printf

既然已經(jīng)拿到了一個共享庫中的函數(shù),那么我們就來牛刀小試一下吧

Python擴展模塊加速方案的示例分析

我們首先在IDLE里面試著運行一下

Python擴展模塊加速方案的示例分析

什么也沒有發(fā)生!貌似被深深的欺騙了!別急,這其中自由原因。

我們先來看看,printf函數(shù)調(diào)用的結(jié)果是什么,使用print查看

Python擴展模塊加速方案的示例分析

看樣子printf函數(shù)的返回值是輸出的字節(jié)數(shù),可是我們還有一個問題沒有解決,那就是,輸出在哪呢?

其實printf函數(shù)是C的函數(shù),并不會輸出到Python中來,因此要使用控制臺來輸出

Python擴展模塊加速方案的示例分析

以上是“Python擴展模塊加速方案的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI