python和go語言的區別是什麼
背景
工作中的主力語言是Python,今年要搞效能測試的工具,由於GIL鎖的原因,Python的效能實在是慘淡,需要學一門效能高的語言來生成效能測試的壓力端。因此我把目光放在了現在的新秀Go。經過一段時間的學習,也寫了一個小工具,記一下這兩個語言的區別。
需求
工具是一個小爬蟲,用來爬某網站的某個產品的迭代記錄,實現邏輯就是執行指令碼後,使用者從命令列輸入某些元素(產品ID等)後,指令碼匯出一個Excel檔案出來。
最初的版本是用Python寫的,30行程式碼不到就搞定了。這次用Go重寫,程式碼量在110行左右。
接受輸入
第一步就是接受命令列的輸入內容,工具要給非技術人員用的,弄一個CLI不太合適,要的效果就是一行一行的輸入內容,用Python實現起來非常容易,像這樣:
app_id = raw_input('請輸入app_id: ') app_analysis = raw_input('請輸入analysis: ')
執行後就是一行一行的往下走,但是用Go就有點蛋疼了,完整的程式碼如下:
func getPara() (string,string) { var i = 0 var appId,analysis string fmt.Print("請輸入appId:") scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { text := scanner.Text() if i == 0 { appId = text fmt.Print("請輸入analysis:") } else if i == 1 { analysis = text fmt.Print("程式初始化資料完畢。。。。請按任意鍵繼續") } else { break } i++ } return appId,analysis }
Go要實現CLI很方便,但是涉及到這種一行一行的輸入,要一直監聽Scan(),所以就有了上面蛋疼的迴圈處理,而且在必須要先列印資訊,再來監聽內容,總體的寫的過程很噁心,也許是沒有找到更好的方法吧,實在是太逆天了。
傳送請求
在傳送請求方便,兩種語言倒是差別不太大,至少我寫的Get請求是這樣的。
Python params = { "analysis": app_analysis,"appid": app_id,"country": 'cn' } r = requests.get(url,params)
Go q := req.URL.Query() q.Add("appid",appId) q.Add("analysis",analysis) q.Add("country","cn") req.URL.RawQuery = q.Encode() var resp *http.Response resp,_ = http.DefaultClient.Do(req)
返回結果處理
在返回結果的處理上,Python的處理方式簡直是太友好了,直接呼叫json就處理了。
result = r.json()
但是Go就有點蛋疼了,由於是靜態語言,所以解包資料的時候需要先定義資料格式,比如返回的內容必須要先做如下的結構定義:
type ResultInfo struct { Code int Msg string Version []VersionInfo } type VersionInfo struct { Version string `json:"version"` ReleaseTime string `json:"release_time"` ReleaseNote string `json:"release_note"` AppName string `json:"app_name"` SubTitle string `json:"subtitle"` }
第一個ResultInfo是返回的資料,其中的Version也是一個數組物件,所以還要再定義一個數組物件,這樣才能呼叫方法來解包處理。
body,_ := ioutil.ReadAll(resp.Body) var rst = ResultInfo{} if err := json.Unmarshal(body,&rst); err != nil { fmt.Println(err) }
寫資料到Excel
這部分呼叫的都是第三方庫,所以沒什麼可比性,程式碼的實現完全依賴於第三方包。
無所不在的err != nil
Go的異常捕獲機制跟Python或者Java都不一樣,Python的異常捕獲使用的是try,except來包裹程式碼塊,而Go用的是一個error物件,所以所有的Go程式碼都會充斥著大量的
if err != nil { return nil,err }
這種鬼東西,這種異常機制在閱讀程式碼的時候,非常噁心,極大的影響了閱讀體驗。
吐槽完後
基本上從書寫程式碼的過程來看,Python的編碼效率比Go高出了很多很多,Go號稱語法靈活,可以極大的提高編碼效率,實際上並沒有,受限於靜態語言,相比於Python這種動態語言來說,編碼效率的差距還是非常大的。只能說比其他靜態語言編碼效率高。
但是!!!
Go的效率比Python高了太多。舉個例子,有一個計算斐波那契數的演算法,Go的實現如下: func main() { const n = 40 starttime := time.Now() fibN := fib(n) endtime := time.Now() cost_time := endtime.Sub(starttime) fmt.Println(cost_time) fmt.Printf("\rFibonacci(%d) = %d\n",n,fibN) } func fib(x int) int { if x < 2 { return x } return fib(x-1) + fib(x-2) }
很簡單的一個遞迴,當N為40的時候,Go花了大概1秒左右的時間,執行結果如下:
876.838ms(消耗時間) Fibonacci(40) = 102334155
我們換成Python
def fib(x): if x<2: return x return fib(x-1)+fib(x-2) if __name__ == '__main__': import time begin = time.time() print fib(40) end = time.time() print end-begin
一樣的執行邏輯,執行的結果卻是:
102334155 52.8657081127(消耗時間)
WTF!!! 用Go來處理效率是Python的50倍以上。
還沒完,工具寫完了總是要給人用的吧,Python寫完之後,如果給一個非技術人員使用,那麼。。。
使用者:要怎麼用? 我:你裝一下Python,然後配好環境變數,順便把requests庫和xlwt庫也裝一下。 我:要裝這兩個庫你要先裝一下pip。 使用者:黑人問號臉!!!!!
如果你用Go來寫,打包完發過去就行了
使用者:要怎麼用? 我:你雙擊一下,讓你輸入什麼就輸入什麼
如果使用者是用Windows系統,那也沒問題,
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build xxx.go
直接打包成exe檔案
知識點擴充套件:
什麼是Python?
Python是一種功能強大的高階程式語言,主要用於科學和工程計算。它是一種高效的語言,優雅務實,簡單而強大,適合新手和專業人士的程式設計。
Python支援多種程式設計範例,並提出了一個大型標準庫,包括面向物件,命令式,功能性和程式性。
Go是什麼?
Go是一種通用程式語言,由Google設計;它借鑑了許多其他許多好主意語言,同時避免導致複雜性和不可靠程式碼的功能。
Go支援多正規化,如程式,功能和併發。它的語法傳統上來自C語言,但它已經做了很多修改,以改進簡單性和安全性等功能。
到此這篇關於python和go語言的區別是什麼的文章就介紹到這了,更多相關go語言和python有什麼區別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!