1.都说Go语言性能非常强大,那么到底比Python强多少?
为了比较Go语言和Python语言在单线程性能上的差距,我们可以做一个简单实验,从1亿减到1:
Python代码(以下均分别提供图片和文字版代码):
import time
def decrement(n):
while n > 0:
n -= 1
start = time.time()
decrement(100000000)
end = time.time()
print(f"{end - start}s.")
结果如下:
Python大约需要4秒-5秒才能完成这项工作,那么Go语言呢?
package main
import "fmt"
import "time"
var c chan int
func 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 main
import (
"C"
"time"
)
var c chan int
func decrement(n int) {
for n > 0 {
n -= 1
}
}
//export count_time
func 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 time
from ctypes import cdll, c_char_p
start = 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写的代码,将能大大提高性能。
全部0条评论
快来发表一下你的评论吧 !