python 程式中呼叫go

2022-02-21 03:08:10 字數 3039 閱讀 6335

雖然python優點很多,但是有乙個致命的缺點就是執行速度太慢,那麼python程式需要一些計算量比較大的模組時一般會呼叫c或者c++的**來重寫,但是c/c++編寫**代價太高,耗費太多的人力,開發周期太長,那麼就想到來乙個折中的方法是用golang語言。

雖然golang效能比不上c、c++,但是golang天生的高併發,以及編譯速度超級快,而且還自帶垃圾**機制,不用開發者自己去管理記憶體,開發效率高。所以在python程式遇到大計算量時,可以考慮呼叫go模組。接下來我們來看看如何在利用go模組寫python第三方模組,以及如何在python中匯入並呼叫。

下面構建乙個go python 模組:

package main

import "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**之後重新生成動態鏈結庫

​go build -buildmode=c-shared -o hello.so src/hello.go

在python中呼叫帶引數的go模組需要顯式指定引數的型別以及返回的資料型別。argtypes指定引數型別,restype

指定返回值型別。

from ctypes import cdll

add = 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-8

import 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...