TOC

使用 Go 语言开发 Python 拓展

Python 有一个好搭档就是 C/C,Python 提供生产力,C/C 则负责效率。
这篇文章探讨 Python + Go 混合开发的可能性。

如何实现

最理想的状态当然是用 Go 的方式开发功能,然后用 Python 的方式来调用,不需要哪一方来做适配,也不需要在中间做太多转换之类的工作。

但这应该很难实现。

我想到的,最直接,最简单,可能也是最无痛的方式,就是是通过 C 库方式来实现:

  1. 直接将 Go 模块编译成库文件:

    go build -buildmode=c-shared -o libmodule.so main.go
    
  2. 然后 Python 方面通过 ctypes 来调用,将需要用到的调用简单封装一下。

    import ctypes
    lib = ctypes.CDLL('./libmodule.so')
    lib.hello()
    

性能测试

我的方法是采用 google/uuid 包,比较:

  1. Go 包
  2. Python uuid 包(底层是 C 写的 _uuid)
  3. C 调用 Go 包
  4. Python 调用 Go 包

在我的老本子上各执行十万次,最后的结论是 0.19 秒,0.36 秒,0.75 秒,0.79 秒。

这个数据不具备参考价值,很可能是我自己的水平问题,我并不擅长做 C 拓展和混合开发。

只能说明,以我现在的水平,不到万不得已,不要在正式项目中采用混合开发。

其他方式

  1. https://github.com/sbinet/go-python
  2. https://github.com/go-python/gopy

参考资料与拓展阅读