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寫的代碼,將能大大提高性能。
-
python
+關注
關注
56文章
4807瀏覽量
85037 -
動態鏈接庫
+關注
關注
0文章
11瀏覽量
7077 -
go語言
+關注
關注
1文章
158瀏覽量
9089 -
單線程
+關注
關注
0文章
17瀏覽量
1788
發布評論請先 登錄
相關推薦
評論