原文来源于:https://www.yii666.com/article/309304.html
Golang构建Python高性能模块
虽然Python优点很多,但是有一个致命的缺点就是运行速度太慢,那么Python程序需要一些计算量比较大的模块时一般会调用c或者c++的代码来重写,但是c/c++编写代码代价太高,耗费太多的人力,开发周期太长,那么就想到来一个折中的方法是用golang语言。
虽然golang性能比不上c、c++,但是golang天生的高并发,以及编译速度超级快,而且还自带垃圾回收机制,不用开发者自己去管理内存,开发效率高。所以在Python程序遇到大计算量时,可以考虑调用go模块。接下来我们来看看如何在利用go模块写Python第三方模块,以及如何在Python中导入并调用。
下面构建一个go python 模块:
编译生成动态链接库,生成的.so文件可以被python加载并调用文章地址https://www.yii666.com/article/309304.html
但是有一个需要注意的地方:
ctypes
python,ctypes , c 对应类型参考 python 官方文档:https://docs.python.org/3.5/library/ctypes.html
这里列举几个常用的数据类型
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 | int |
c_char_p | char * (NUL terminated) | 1-character bytes object |
c_wchar_p | wchar_t * (NUL terminated) | string or None |
比如创建一个带参数的go函数:
写好go代码之后重新生成动态链接库
go build -buildmode=c-shared -o hello.so src/hello.go
在python中调用带参数的go模块需要显式指定参数的类型以及返回的数据类型。argtypes指定参数类型,restype文章来源地址:https://www.yii666.com/article/309304.html
指定返回值类型。
文章来源地址https://www.yii666.com/article/309304.html
python 中调用go模块,并统计两个模块循环1百万次累加的时间,查看go跟python执行效率
单从循环一百万次来看,go的效率要高很多。网址:yii666.com<
Python 号称开发速度快,而go语言在静态语言中也号称是开发开发速度最快的,go的高并发刚好可以填补Python GIL导致Python多线程不是真的多线程这一缺点。
本文主要讲解了如何使用golang写Python模块,以及在Python中如何调用go模块,主要要注意的是参数类型的转换。网址:yii666.com