偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

核心代碼從Python換成Go語言,提速30倍!

開發(fā) 后端
Stream公司最近將其核心服務的后端從Python切換成了Go,雖然他們內部還在使用Python,但是公司已經決定從現在開始在Go中編寫所有性能密集型代碼。本文,Stream首席執(zhí)行官和創(chuàng)始人Thierry Schellenbach解釋了公司的這一決定。
[[224146]]

Stream公司最近將其核心服務的后端從Python切換成了Go,雖然他們內部還在使用Python,但是公司已經決定從現在開始在Go中編寫所有性能密集型代碼。本文,Stream***執(zhí)行官和創(chuàng)始人Thierry Schellenbach解釋了公司的這一決定。

選擇項目或產品的編程語言會受到許多因素驅動,與所有技術決策一樣,沒有***的答案足以解決所有問題。Stream之所以這么做,是因為感受到了Go語言的巨大好處。

這與Stream的產品有關。Stream是用于構建,縮放、個性化新聞源和活動流的API。每月為3億多用戶提供約10億次API請求。因此,性能和可靠性是Stream制定每項技術決策的最重要原因。

Python和GO:性能對比!

Go***的賣點可能就是性能,無論是運行時間還是編譯時間。它在大多數計算基準測試中與Java或C ++相當。在Stream的實際使用中,GO比Python快大約30倍。

選擇性能優(yōu)秀的工具非常重要(Stream已經優(yōu)化了Cassandra,PostgreSQL,Redis和許多其他技術)。然而,有時發(fā)現系統(tǒng)中的瓶頸確實是Python引起的,像序列化,排序和聚合等計算繁重的任務有時會比從網絡數據存儲檢索數據花費更長的時間。

Go編譯器(本身是用Go編寫的)也非常快。使用Go編寫的Stream中最復雜的微服務只需要6秒即可編譯完成,與Java和C ++等工具鏈相比,這是一個重大勝利。

此外,閱讀Go語言代碼往往非常簡單,GO干凈的風格讓讀取和推理更容易。

本地并發(fā)

通過goroutines和channel將并發(fā)性融入到語言中。Goroutines在概念上類似于操作系統(tǒng)線程,但非常便宜——每個成本只有幾KB的堆??臻g。Go運行時可以處理智能多路復用goroutines,這一切對程序員來說是透明的。單個程序擁有數千個goroutines并不罕見。例如,net / http軟件包中的服務器為每個傳入的HTTP請求創(chuàng)建一個goroutine。

在真正的Go語言中,goroutine非常簡單:只需在“go”關鍵字前添加一個函數調用,讓它運行在自己的goroutine中即可。

Go世界的傳統(tǒng)觀點是“不通過共享內存來交流,相反的是,通過通信來共享內存“。在goroutines之間進行通信的原語是channel,它們與goroutines一樣易于使用。channel有一個類型,可以通過直觀的箭頭語法輕松地在goroutine之間傳遞數據。雖然簡單,但channel非常強大。通過預先考慮,與傳統(tǒng)系統(tǒng)相比,制作大規(guī)模并發(fā)系統(tǒng)是一件輕而易舉的事情。

使用簡單的并發(fā)工具,可以解決那些經常導致錯誤的復雜問題。Go隨附內置競速檢測器,可以更輕松檢測異步代碼中的競爭狀態(tài)。

生態(tài)系統(tǒng)

Go仍然是編譯語言環(huán)境的新手,遠比不上C ++和Java等傳統(tǒng)語言的普及程度。雖然只有大約5%的程序員知道Go,但是這個數字還在不斷增長,而且這種增長是由于語言的易用性所致。雖然語言快速且功能強大,但該語言只有25個保留字(與C ++ 92或Java 53相比),對于大多數開發(fā)人員來說,它只會引入很少的新概念。

建立一個Go開發(fā)團隊比大多數語言更容易,因為它更容易學習。

隨Go提供的內置庫在開箱即用,功能強大。使用`net / http`包制作HTTP服務只需要幾行代碼,并且本地支持http / 2,TLS和websocket等。社區(qū)軟件包的生態(tài)系統(tǒng)也很出色,適用于Redis,RabbitMQ,PostgreSQL和RocksDB等。

其他福利

Go節(jié)省時間的另一種方式是使用Gofmt。它是一個命令行工具,可與大多數編輯器集成并自動將代碼格式化為事實標準。如果格式不正確,代碼仍會編譯,但除非通過gofmt運行代碼以保持整個代碼庫格式一致,否則將不會查看pull請求。這使代碼審查人員能夠專注于代碼而不是花時間挑剔格式。

Go有助于開發(fā)微服務架構,gRPC和Google的協(xié)議緩沖區(qū)是管理微服務之間通信的好方法,Go有***的支持。

Python與Go

Stream服務中的一個強大功能是排名提要。排名提要允許用戶為提要指定一個評分函數,以便控制提取時的排序方式。評分算法可以提供很多變量來確定排名,但基于流行度的一個很好的例子可能是這樣的:

 

圖3:核心代碼從Python換成Go語言,提速30倍!
  1. 要支持這種排名方法,Python和Go代碼都需要:解析分數的表達式。在這種情況下,我們想將字符串“simple_gauss(time)* popular”變成一個函數,它將一個活動作為輸入并返回一個分數作為輸出。
  2. 根據JSON配置創(chuàng)建部分函數。例如,我們希望“simple_gauss”以五天的刻度,一天的偏移量和0.3的衰減因子來調用“decay_gauss”。
  3. 如果在活動中沒有定義某個字段,則應對“默認值”配置進行壓縮,以便進行回退。
  4. 使用步驟1中的功能對Feed中的所有活動進行評分。

開發(fā)Python版本的示例花了大約三天的時間編寫代碼,單元測試和文檔。接下來,團隊花了大約兩周的時間來優(yōu)化代碼。其中一項優(yōu)化是將分數表達式(simple_gauss(time)* popular)轉換為抽象語法樹。該團隊還實施了高速緩存邏輯,預先計算了將來某些時間的分數。

相比之下,開發(fā)此代碼的Go版本需要大約四天的時間,并且性能不需要任何進一步的優(yōu)化。雖然Python的開發(fā)初期看來更快,但Go版本最終需要的工作量大大減少。

在優(yōu)化代碼庫時節(jié)省的時間歸功于Go語言的特點。使用Python,程序員不得不將表達式解析為抽象語法樹,并優(yōu)化/剖析通過排名公開的每個函數。

結論

Go是編寫微服務的偉大語言。它的速度非???,具有原生并發(fā)原語,對現有工具的卓越支持,并且開發(fā)起來非常有趣。與Ruby或Python等腳本語言相比,Go語言可能需要更長的時間,但維護成本要低得多,而且將節(jié)省大量時間優(yōu)化代碼。

重要的是,Stream仍然在使用Python,它是有意義的。例如,儀表板,網站和個性化訂閱源的機器學習使用Python,因為工具更好。Stream不會馬上告別Python,但是今后會在Go中編寫所有性能密集型代碼。

責任編輯:未麗燕 來源: 程序師
相關推薦

2023-05-04 15:32:51

編程開發(fā)

2024-12-04 10:19:49

2022-08-09 09:10:31

TaichiPython

2020-04-20 11:09:18

Python開發(fā)語言

2021-02-17 13:20:51

forpandas語言

2021-05-17 09:57:42

Python 開發(fā)編程語言

2021-03-04 09:25:08

Go語言惡意軟件黑客

2020-01-14 15:03:27

Python代碼編程語言

2016-10-08 16:02:37

WIFIMegaMIMO系統(tǒng)

2020-05-01 12:35:31

C++Python編程

2013-02-28 10:35:59

hadoop大數據Hortonworks

2016-03-21 10:16:06

RedisSpark大數據處理

2023-10-11 06:59:48

Go語言切片

2023-12-11 15:40:32

PyTorch代碼大模型

2016-05-26 17:33:31

華為,云計算,數據中心

2024-08-12 12:27:03

2017-08-31 13:50:53

Python編程語言

2018-07-27 09:32:18

Python代碼數據

2013-09-24 09:40:41

Java圖形加速

2021-01-06 09:47:51

內存Go語言
點贊
收藏

51CTO技術棧公眾號