1.都說Go語(yǔ)言性能非常強(qiáng)大,那么到底比Python強(qiáng)多少?
為了比較Go語(yǔ)言和Python語(yǔ)言在單線程性能上的差距,我們可以做一個(gè)簡(jiǎn)單實(shí)驗(yàn),從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.")
結(jié)果如下:
Python大約需要4秒-5秒才能完成這項(xiàng)工作,那么Go語(yǔ)言呢?
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))
}
結(jié)果如下:
確實(shí),兩者差了不止100倍,看得出來Go是一個(gè)比較有前途的語(yǔ)言,具有強(qiáng)大的性能(除此之外,它還有簡(jiǎn)單易學(xué)、能輕松實(shí)現(xiàn)高并發(fā)的特點(diǎn))。
不過,它的社區(qū)建設(shè)和Python相比還是有很大的差距,許多第三方庫(kù)依然還沒有支持Go語(yǔ)言,因此,它想要替代Python還有非常長(zhǎng)的路要走。
2.Go性能強(qiáng)大、Python社區(qū)強(qiáng)大,兩者能否結(jié)合起來?
我們?cè)囋嚳茨芊裨赑ython中調(diào)用Go的方法,在Go中從1億減到1。
首先,將剛剛go語(yǔ)言版的1億減到1改為在一個(gè)函數(shù)中進(jìn)行,并返回結(jié)果:
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() {}
然后生成動(dòng)態(tài)鏈接庫(kù)以便Python調(diào)用Go里寫的函數(shù):
go build -buildmode=c-shared -o main.so count.go
這樣會(huì)在當(dāng)前文件夾中生成 main.so 和 main.h.
在Python中我們需要加載該生成的main.so動(dòng)態(tài)鏈接庫(kù),并配置好輸出變量的類型,最后調(diào)用方法得到結(jié)果:
import time
from ctypes import cdll, c_char_p
start = time.time()
# 加載動(dòng)態(tài)鏈接庫(kù)
lib = cdll.LoadLibrary('./main.so')
# 配置輸出參數(shù)變量類型
lib.count_time.restype = c_char_p
# 調(diào)用方法
rest = lib.count_time()
end = time.time()
print(f"Go 內(nèi)部執(zhí)行時(shí)間:{rest}")
print(f"Python 整體執(zhí)行時(shí)間: {end - start}s")
結(jié)果如下:
可以看到,使用這個(gè)方案將Python和Go兩者結(jié)合起來的性能依然非常高,但就是多了一個(gè)生成和調(diào)用動(dòng)態(tài)鏈接庫(kù)的過程,增加了代碼的耦合性。
其實(shí),這也是C+Python的開發(fā)方式,只不過我們將C換成了Go,因?yàn)镚o開發(fā)起來實(shí)在是舒服多了。
如果以后你的Python代碼中有某個(gè)部分計(jì)算特別復(fù)雜,你可以嘗試將其改寫成go,通過動(dòng)態(tài)鏈接庫(kù)的方式調(diào)用go寫的代碼,將能大大提高性能。
-
python
+關(guān)注
關(guān)注
56文章
4822瀏覽量
85906 -
動(dòng)態(tài)鏈接庫(kù)
+關(guān)注
關(guān)注
0文章
11瀏覽量
7123 -
go語(yǔ)言
+關(guān)注
關(guān)注
1文章
158瀏覽量
9248 -
單線程
+關(guān)注
關(guān)注
0文章
18瀏覽量
1817
發(fā)布評(píng)論請(qǐng)先 登錄
Go語(yǔ)言開發(fā)有什么優(yōu)勢(shì)?怎么學(xué)?
Go開發(fā)語(yǔ)言的優(yōu)勢(shì)在哪里?
python和別的語(yǔ)言比所具備的優(yōu)勢(shì)
網(wǎng)易有道CEO周楓推薦Go語(yǔ)言并介紹Go語(yǔ)言的3個(gè)優(yōu)點(diǎn)
Python 轉(zhuǎn)向 Go語(yǔ)言的9大原因和3大缺點(diǎn)
我們?cè)谑褂?b class='flag-5'>Go語(yǔ)言編程之前有什么呢?為什么選擇Go語(yǔ)言編程?
Go和Python,Erlang的語(yǔ)言對(duì)比分析和Go編程示例概述

Go語(yǔ)言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替Python
蘋果a14比a13強(qiáng)多少
詳解GO語(yǔ)言的趨勢(shì)與使用情況
go語(yǔ)言枚舉類型怎么用
Go/Rust挑戰(zhàn)Java/Python地位
Go能取代Python成為開發(fā)者的首選語(yǔ)言嗎?

如何讓Python和Go互相調(diào)度

評(píng)論