go和python组合开发_优劣互补! Python+Go结合开发的探讨

1.都说Go语言性能非常强大,那么到底比Python强多少?

为了比较Go语言和Python语言在单线程性能上的差距,我们可以做一个简单实验,从1亿减到1:

Python代码(以下均分别提供图片和文字版代码):

import timedef decrement(n):while n > 0:n -= 1start = time.time()decrement(100000000)end = time.time()print(f"{end - start}s.")

结果如下:

Python大约需要4秒-5秒才能完成这项工作,那么Go语言呢?

package mainimport "fmt"import "time"var c chan intfunc decrement(n int) {for n > 0 {n -= 1}}func main() {start := time.Now()decrement(100000000)fmt.Println(time.Since(start))}

结果如下:

确实,两者差了不止100倍,看得出来Go是一个比较有前途的语言,具有强大的性能(除此之外,它还有简单易学、能轻松实现高并发的特点)。

不过,它的社区建设和Python相比还是有很大的差距,许多第三方库依然还没有支持Go语言,因此,它想要替代Python还有非常长的路要走。

2.Go性能强大、Python社区强大,两者能否结合起来?

我们试试看能否在Python中调用Go的方法,在Go中从1亿减到1。

首先,将刚刚go语言版的1亿减到1改为在一个函数中进行,并返回结果:

package mainimport ("C""time")var c chan intfunc decrement(n int) {for n > 0 {n -= 1}}//export count_timefunc count_time() *C.char {start := time.Now()decrement(100000000)total_time := time.Since(start).String()return C.CString(total_time)}func main() {}

然后生成动态链接库以便Python调用Go里写的函数:

go build -buildmode=c-shared -o main.so count.go

这样会在当前文件夹中生成 main.so 和 main.h.

在Python中我们需要加载该生成的main.so动态链接库,并配置好输出变量的类型,最后调用方法得到结果:

import timefrom ctypes import cdll, c_char_pstart = time.time()# 加载动态链接库lib = cdll.LoadLibrary('./main.so')# 配置输出参数变量类型lib.count_time.restype = c_char_p# 调用方法rest = lib.count_time()end = time.time()print(f"Go 内部执行时间:{rest}")print(f"Python 整体执行时间: {end - start}s")

结果如下:

可以看到,使用这个方案将Python和Go两者结合起来的性能依然非常高,但就是多了一个生成和调用动态链接库的过程,增加了代码的耦合性。

其实,这也是C+Python的开发方式,只不过我们将C换成了Go,因为Go开发起来实在是舒服多了。

如果以后你的Python代码中有某个部分计算特别复杂,你可以尝试将其改写成go,通过动态链接库的方式调用go写的代码,将能大大提高性能。

这样,既能安心享受Python带来的丰富社区资源,又能享受Go语言的性能优势,真的美滋滋。

如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看

,有任何问题都可以在下方留言,我们会耐心解答的!

点击下方阅读原文可以获取所有代码和链接哦!

Python实用宝典 (pythondict.com)

不只是一个宝典

欢迎关注公众号:Python实用宝典

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值