在M1实现Python调用GO动态链接库

本文最后更新于:2022年7月9日 凌晨

前言

众所周知,Python作为一门解释性语言,在面对CPU密集型任务时的运行效率一直收到诟病。而Go语言在同样任务的情况下,效率甚至可以达到Python的几十倍。但Python的开发效率是比Go高的,那么有没有一种方法可以结合Python的开发效率和Go的运行效率呢?有,那就是用Python调用Go的动态链接库。

开始

首先我们先编写Go的代码

以斐波那契数列为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import "C";

//export fibonacci
func fibonacci(num int) int {
if num < 2 {
return 1
}
return fibonacci(num - 1) + fibonacci(num - 2)
}

func main(){
}

首先需要引入’C’这个模块
接着我们通过递归的方式实现了’fibonacci’这个函数,需要注意的是,函数上方的注释不能省略。
接着需要添加一个main函数,不需要具体的实现代码。

编译Go代码

1
go build -buildmode=c-shared -o lib_fib.so lib_fib.go

-o 后面跟着的编译后文件名
最后一个参数是go代码文件名
需要注意的是,在编译前先确定你的Python版本。我之前就因为安装的x86Python,但是Go编译成了ARM版本,导致一直无法调用。

编写Python代码

1
2
3
4
from ctypes import cdll

libadd = cdll.LoadLibrary("libb_fib.so")
result = libadd.fibonacci(40)

Python的代码很简单,先导入cdll,然后加载上一步编译的.so文件。
接着就可以直接调用fibonacci函数了。