雖然python優點很多,但是有乙個致命的缺點就是執行速度太慢,那麼python程式需要一些計算量比較大的模組時一般會呼叫c或者c++的**來重寫,但是c/c++編寫**代價太高,耗費太多的人力,開發周期太長,那麼就想到來乙個折中的方法是用golang語言。
雖然golang效能比不上c、c++,但是golang天生的高併發,以及編譯速度超級快,而且還自帶垃圾**機制,不用開發者自己去管理記憶體,開發效率高。所以在python程式遇到大計算量時,可以考慮呼叫go模組。接下來我們來看看如何在利用go模組寫python第三方模組,以及如何在python中匯入並呼叫。
下面構建乙個go python 模組:
package mainimport "c"
//指定那些函式能被外部呼叫
//export test
func test() int
return s}
func main()
編譯生成動態鏈結庫,生成的.so檔案可以被python載入並呼叫
但是有乙個需要注意的地方:
python是利用ctypes
來跟so模組進行互動,其中存在著乙個**的翻譯過程,包括資料型別的翻譯,如果需要傳參獲取接收返回值,需要在golang中將引數按照下表對應,定義成c語言的資料型別。
python,ctypes , c 對應型別參考 python 官方文件:
這裡列舉幾個常用的資料型別
ctypes type(ctypes型別)
c type(c語言型別)
python type(python型別)
c_bool
_bool
bool (1)
c_char
char
1-character bytes object
c_wchar
wchar_t
1-character string
c_byte
char
intc_char_p
char * (nul terminated)
1-character bytes object
c_wchar_p
wchar_t * (nul terminated)
string or none
比如建立乙個帶引數的go函式:
// 指定接收的引數為c型別的字串,返回c型別字串//pxport addstr
func addstr(a,b * c.char) *c.char
寫好go**之後重新生成動態鏈結庫在python中呼叫帶引數的go模組需要顯式指定引數的型別以及返回的資料型別。argtypes指定引數型別,restypego build -buildmode=c-shared -o hello.so src/hello.go
指定返回值型別。
from ctypes import cdlladd = cdll('./hello.so').addstr #呼叫go模組
# 顯式宣告引數和返回的期望型別
add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
add.restype = ctypes.c_char_p
print(add('haha','hehe'))
# 無引數,則可直接呼叫
t = cdll('./hello.so').test #呼叫go模組
print(t())
python 中呼叫go模組,並統計兩個模組迴圈1百萬次累加的時間,檢視go跟python執行效率
# coding=utf-8import time
from ctypes import cdll
import ctypes
def xu():
# python 計算累加
sum = 0
for i in range(0,1000000+1):
sum += i
return sum
if __name__ =="__main__":
add = cdll('./hello.so').addstr #呼叫go模組addstr方法
# 顯式宣告引數和返回的期望型別
add.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
add.restype = ctypes.c_char_p
print(add('haha','hehe'))
# go 一百萬次累加
start = time.time()
t = cdll('./hello.so').test #呼叫go模組test方法
t.restype = ctypes.c_int64 # 返回int64型別
print("go執行結果:%s"%t())
end = time.time()
print("go :1000000 累加耗時 %.2f" %(end-start))
# python累加一百萬次
start = time.time()
print("python執行結果:%s"%xu())
end = time.time()
print("python :1000000 累加耗時 %.2f" %(end-start))
單從迴圈一百萬次來看,go的效率要高很多。
python 號稱開發速度快,而go語言在靜態語言中也號稱是開發開發速度最快的,go的高併發剛好可以填補python gil導致python多執行緒不是真的多執行緒這一缺點。
本文主要講解了如何使用golang寫python模組,以及在python中如何呼叫go模組,主要要注意的是引數型別的轉換。
python呼叫其他程式 python呼叫其他程式
在python中可以方便地使用os模組執行其他的指令碼或者程式,這樣就可以在指令碼中直接使用其他指令碼,或者程式提供的功能,而不必再次編寫實現該功能的 為了更好地控制執行的程序,可以使用win32process模組中的函式。如果想進一步控制程序,則可以使用ctype模組,直接呼叫kernel32.d...
Python中呼叫其他程式的方式
在python中,可以方便地使用os模組來執行其他指令碼或者程式,這樣就可以在指令碼中直接使用其他指令碼或程式提供的功能,而不必再次編寫實現該功能的 為了更好地控制執行的程序,可以使用win32process模組中的函式,如果想進一步控制程序,則可以使用ctype模組,直接呼叫kernel32.dl...
matlab呼叫python程式
執行命令 pyversion filepath 若已關聯,則不需要執行此命令,其中 filepath 為 python 程式所用的直譯器的絕對路徑,如 d anaconda3 python.exe。詳見pyversion官方文件 例如呼叫某python函式 data2mat.getdata cd p...