自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

選擇項(xiàng)目或產(chǎn)品的編程語(yǔ)言會(huì)受到許多因素驅(qū)動(dòng),與所有技術(shù)決策一樣,沒有***的答案足以解決所有問題。Stream之所以這么做,是因?yàn)楦惺艿搅薌o語(yǔ)言的巨大好處。

這與Stream的產(chǎn)品有關(guān)。Stream是用于構(gòu)建,縮放、個(gè)性化新聞源和活動(dòng)流的API。每月為3億多用戶提供約10億次API請(qǐng)求。因此,性能和可靠性是Stream制定每項(xiàng)技術(shù)決策的最重要原因。

Python和GO:性能對(duì)比!

Go***的賣點(diǎn)可能就是性能,無論是運(yùn)行時(shí)間還是編譯時(shí)間。它在大多數(shù)計(jì)算基準(zhǔn)測(cè)試中與Java或C ++相當(dāng)。在Stream的實(shí)際使用中,GO比Python快大約30倍。

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

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

此外,閱讀Go語(yǔ)言代碼往往非常簡(jiǎn)單,GO干凈的風(fēng)格讓讀取和推理更容易。

本地并發(fā)

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

在真正的Go語(yǔ)言中,goroutine非常簡(jiǎn)單:只需在“go”關(guān)鍵字前添加一個(gè)函數(shù)調(diào)用,讓它運(yùn)行在自己的goroutine中即可。

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

使用簡(jiǎn)單的并發(fā)工具,可以解決那些經(jīng)常導(dǎo)致錯(cuò)誤的復(fù)雜問題。Go隨附內(nèi)置競(jìng)速檢測(cè)器,可以更輕松檢測(cè)異步代碼中的競(jìng)爭(zhēng)狀態(tài)。

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

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

建立一個(gè)Go開發(fā)團(tuán)隊(duì)比大多數(shù)語(yǔ)言更容易,因?yàn)樗菀讓W(xué)習(xí)。

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

其他福利

Go節(jié)省時(shí)間的另一種方式是使用Gofmt。它是一個(gè)命令行工具,可與大多數(shù)編輯器集成并自動(dòng)將代碼格式化為事實(shí)標(biāo)準(zhǔn)。如果格式不正確,代碼仍會(huì)編譯,但除非通過gofmt運(yùn)行代碼以保持整個(gè)代碼庫(kù)格式一致,否則將不會(huì)查看pull請(qǐng)求。這使代碼審查人員能夠?qū)W⒂诖a而不是花時(shí)間挑剔格式。

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

Python與Go

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

 

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

開發(fā)Python版本的示例花了大約三天的時(shí)間編寫代碼,單元測(cè)試和文檔。接下來,團(tuán)隊(duì)花了大約兩周的時(shí)間來優(yōu)化代碼。其中一項(xiàng)優(yōu)化是將分?jǐn)?shù)表達(dá)式(simple_gauss(time)* popular)轉(zhuǎn)換為抽象語(yǔ)法樹。該團(tuán)隊(duì)還實(shí)施了高速緩存邏輯,預(yù)先計(jì)算了將來某些時(shí)間的分?jǐn)?shù)。

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

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

結(jié)論

Go是編寫微服務(wù)的偉大語(yǔ)言。它的速度非??欤哂性l(fā)原語(yǔ),對(duì)現(xiàn)有工具的卓越支持,并且開發(fā)起來非常有趣。與Ruby或Python等腳本語(yǔ)言相比,Go語(yǔ)言可能需要更長(zhǎng)的時(shí)間,但維護(hù)成本要低得多,而且將節(jié)省大量時(shí)間優(yōu)化代碼。

重要的是,Stream仍然在使用Python,它是有意義的。例如,儀表板,網(wǎng)站和個(gè)性化訂閱源的機(jī)器學(xué)習(xí)使用Python,因?yàn)楣ぞ吒?。Stream不會(huì)馬上告別Python,但是今后會(huì)在Go中編寫所有性能密集型代碼。

責(zé)任編輯:未麗燕 來源: 程序師
相關(guān)推薦

2024-12-04 10:19:49

2023-05-04 15:32:51

編程開發(fā)

2022-08-09 09:10:31

TaichiPython

2020-04-20 11:09:18

Python開發(fā)語(yǔ)言

2021-03-04 09:25:08

Go語(yǔ)言惡意軟件黑客

2021-05-17 09:57:42

Python 開發(fā)編程語(yǔ)言

2020-01-14 15:03:27

Python代碼編程語(yǔ)言

2021-02-17 13:20:51

forpandas語(yǔ)言

2023-10-11 06:59:48

Go語(yǔ)言切片

2020-05-01 12:35:31

C++Python編程

2023-12-11 15:40:32

PyTorch代碼大模型

2024-08-12 12:27:03

2016-03-21 10:16:06

RedisSpark大數(shù)據(jù)處理

2013-02-28 10:35:59

hadoop大數(shù)據(jù)Hortonworks

2016-10-08 16:02:37

WIFIMegaMIMO系統(tǒng)

2016-05-26 17:33:31

華為,云計(jì)算,數(shù)據(jù)中心

2018-07-27 09:32:18

Python代碼數(shù)據(jù)

2021-01-06 09:47:51

內(nèi)存Go語(yǔ)言

2017-08-31 13:50:53

Python編程語(yǔ)言庫(kù)

2019-12-06 13:59:37

代碼開發(fā)Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)