python深入和扩展_加速方案 — Python扩展模块
原標題:加速方案 — Python擴展模塊
ctypes(一)— 初識
這章我們介紹Python的擴展名之ctypes,教大家認識ctypes。喜歡Python的讀者們可以加Python學習交流群:579817333 讓我們共同進步!
很多初學Python的新手,總是嘴邊掛著一句話:“Python是一門膠水語言”。
可是究竟什么是膠水語言呢?相信很多人都不知道,或者誤以為膠水就是可以直接和其他所有語言配合的語言。
雖然如今Python已經發展得很強大了,“膠水語言”這個特性已經很少被提及了。但是膠水仍然是它現在應用得最廣泛的特性之一。只不過從曾經Python為輔變成了如今的Python為主而已。
那么到底什么是“膠水特性”呢?
其實Python自打出生以來就和C語言有莫大的關聯,它可以調用現有的C/C++程序,而不用做那些重復造輪子的事。使得節約了大量的重新開發的成本。許多的現有C程序代碼可以用一個Python作為中樞來管理和調用,就好像這些C程序“被膠水粘住了”一樣。這就是膠水特性的來源。
隨著Python語言的發展,Python已經變得足夠強大和健壯,在不斷優化性能的過程中,膠水這一特性被逐漸弱化,因為Python已經強大到不需要依附C語言而存在。但是這一特性讓然被保留了下來。
那么,既然Python已經足夠強大,那么還需要這一特性做什么呢?
說到底,Python是一個解釋型動態腳本語言,再加上十幾年沒有解決的GIL鎖,無論是執行效率還是并發性都是Python最大的缺點。
因此這個特性的存在給如今的Pythoner一個新的選擇,那些對執行效率和并發性有著極高要求的模塊,使用C來實現。使用C來輔助Python解決某些特殊情況下的性能問題,成了如今Python社區中最為普遍的方案,很多人不知道,事實上很多我們常用的庫都利用了這一特性。
大家有什么不懂的或者不會的可以加群 python學習交流 579817333
數據兼容層
由于Python這一特性是一個大家族,我們先來了解一下Python與C之間做的一個兼容層模塊 — ctypes 模塊。
了解 ctypes模塊之前,我們需要先了解 ctypes 提供了哪些用于兼容的數據類型:
注:一下表格是根據Python3版本列出,區別僅僅是原生字符串類型和long整型而已
ctypes 類型
c 類型
Python 類型
c_bool
_Bool
bool(1)
c_char
char
一個字符的bytes
c_wchar
wchar_t
一個字符的string
c_byte
char
int
c_ubyte
unsigned char
int
c_short
short
int
c_ushort
unsigned short
int
c_int
int
int
c_uint
unsigned int
int
c_long
long
int
c_ulong
unsigned long
int
c_longlong
__int64 或 long long
int
c_ulonglong
unsigned __int64 或 unsigned long long
int
c_size_t
size_t
int
c_ssize_t
ssize_t 或 Py_ssize_t
int
c_float
float
float
c_double
double
float
c_longdouble
long double
float
c_char_p
char * (NUL terminated)
string 或 None
c_wchar_p
wchar_t * (NUL terminated)
string 或 None
c_void_p
void *
int 或 None
嘗試共享庫
什么是共享庫?
其實C語言在經過編譯之后不一定要生成可執行文件,可以以一種共享給其他程序調用的“共享庫”的形式存在,其他程序通過調用這個共享庫,就可以利用這個現有C編譯過的程序了。
為了對各位新手朋友能夠更加產生更加直接的幫助,我們以Windows系統為例,調用VC共享庫。Windows下默認給VC共享庫加上dll擴展名后綴。
我們以加載 cdecl 調用規則函數的 cdll 模塊進行展示
首先,我們必須要導入 cdll 可以參考一下語句
from ctypes import cdll
然后可以直接通過對 cdll 的屬性訪問獲得 msvcrt.dll 共享庫文件的連接
libc = cdll.msvcrt
接著,我們就可以從這個共享庫中獲得相應的VC函數了,最常見的是printf函數(ps:不知道有沒有引起一些老司機的眼淚呢?)
printf = libc.printf
既然已經拿到了一個共享庫中的函數,那么我們就來牛刀小試一下吧
大家有什么不懂的或者不會的可以加群 python學習交流 579817333
我們首先在IDLE里面試著運行一下
什么也沒有發生!貌似被深深的欺騙了!別急,這其中自由原因。
我們先來看看,printf函數調用的結果是什么,使用print查看
看樣子printf函數的返回值是輸出的字節數,可是我們還有一個問題沒有解決,那就是,輸出在哪呢?
其實printf函數是C的函數,并不會輸出到Python中來,因此要使用控制臺來輸出
是不是已經成功輸出了?
在了解這些最基礎的知識以后,我們就可以更加深入的去了解其中相關的規則,下次我們會具體介紹一些其中的規則,讓你對這個庫的使用更加得心應手。
大家有什么不懂的或者不會的可以加群 python學習交流 579817333 群里有大量的關于Python的視頻學習資料返回搜狐,查看更多
責任編輯:
總結
以上是生活随笔為你收集整理的python深入和扩展_加速方案 — Python扩展模块的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: java obervable_RxJav
- 下一篇: windows系统改装为linux系统_
