溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python開發(fā)者在轉(zhuǎn)到Go語言之前需要了解什么

發(fā)布時(shí)間:2021-11-02 17:42:20 來源:億速云 閱讀:177 作者:柒染 欄目:web開發(fā)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Python開發(fā)者在轉(zhuǎn)到Go語言之前需要了解什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

背景

在Repustate,我們完成過的最棒的技術(shù)成就之一是實(shí)現(xiàn)了阿拉伯語的情感分析。阿拉伯語是一塊難啃的硬骨頭,因?yàn)樗脑~形變化相當(dāng)復(fù)雜。比起譬如英語,阿拉伯語的分詞(將一個(gè)句子切分呈幾個(gè)獨(dú)立的單詞)也更困難,因?yàn)榘⒗Z的單詞本身還可能會(huì)包含空白字符(例如:“阿列夫”在一個(gè)單詞里的位置)。這也談不上是泄密,Repustate 使用支持向量機(jī)(SVM)來獲取一個(gè)句子背后最有可能的含義,并在其中加上情感元素。 總體上來說,我們使用了 22 種模型(22 個(gè) SVM) 并且在一篇文檔中,每一個(gè)單詞我們都會(huì)加以分析。因此如果你有一篇 500 字的文檔,那么基于 SVM,會(huì)進(jìn)行十萬次的比較。

Python

Repustate 幾乎完全就是一個(gè)Python 商店。我們使用Django來實(shí)現(xiàn) API 和網(wǎng)站。因此(目前)為了保持代碼一致,同時(shí)使用 Python 來實(shí)現(xiàn)阿拉伯語情感引擎是合情合理的。只是做原型和實(shí)現(xiàn)的話,Python 是很好的選擇。它的表達(dá)能力很強(qiáng)悍,第三方類庫(kù)等等也很好。如果你就是為了Web服務(wù),Python 很***。但是當(dāng)你進(jìn)行低級(jí)別的計(jì)算,大量依賴于哈希表(Python 里的字典類型)做比較的時(shí)候,一切都變慢了。我們每秒能處理大約兩到三個(gè)阿拉伯文檔,但是這太慢了。比較下來,我們的英語情感引擎每秒能處理大約五百份文檔。

瓶頸

因此我們開啟了Python 分析器,開始調(diào)查是什么地方用了那么長(zhǎng)時(shí)間。還記得我前面說過我們有 22 個(gè) SVM 并且每個(gè)單詞都需要經(jīng)過處理嗎?好吧,這些都是線性處理的,非并行處理。所以我們的***反應(yīng)是把線性處理改成 map/reduce 那樣的操作。簡(jiǎn)單來說:Python 不太適合用作 map/reduce。當(dāng)你需要并發(fā)的時(shí)候,Python 算上好用。在 2013 Python 大會(huì)上(譯者:PyCon 2013),Guido 談到了 Tulip,他的這個(gè)新項(xiàng)目正在彌補(bǔ) Python 這方面的不足,不過得過段一段時(shí)間才能推出,但是如果已經(jīng)有了更好用的東西,我們?yōu)槭裁催€要等呢?

選Go 語言,還是回家算了?

我在Mozilla的朋友告訴我,Mozilla 內(nèi)部正在將他們大量的基礎(chǔ)日志架構(gòu)切換到 Go 語言上,部分原因是因?yàn)閺?qiáng)大的 [編程語言是如何工作(解釋型 vs 編譯型, 動(dòng)態(tài)語言 vs 靜態(tài)語言)有一點(diǎn)理解的話,會(huì)說,“切,當(dāng)然 Go 語言會(huì)更快”。是的,我們也可以用 Java 把所有的東西重寫一遍,也能看到類似更快的改善,但那不是 Go 語言勝出的原因。你用 Go 寫的代碼好像就是對(duì)的。我搞不清楚到底是怎么回事,但是一旦代碼被編譯了(編譯速度很快),你就會(huì)覺得這代碼能工作(不只是跑起來不會(huì)錯(cuò),而且甚至邏輯上也是對(duì)的)。我知道,這聽上去不太靠譜,但是確實(shí)如此。這和 Python 在冗余(或非冗余)方面非常類似,它把函數(shù)作為***目標(biāo),因此函數(shù)編程會(huì)很容易想明白。而且當(dāng)然,go 線程和通道讓你的生活更容易,你可以得到靜態(tài)類型帶來的性能大提升,還能更精細(xì)的控制內(nèi)存分配,而你卻不必為此在語言表達(dá)力上付出太多的代價(jià)。

希望能早點(diǎn)知道的事情(Tips & Tricks)

除去所有這些贊美之詞以后,有時(shí)你真的需要在處理 Go 代碼的時(shí)候,相對(duì)于 Python,改變一下思維方式。因此這是我在遷移代碼時(shí)記錄的筆記清單 —— 只是在我把 Python 代碼轉(zhuǎn)換到 Go 時(shí)從我腦子里隨機(jī)冒出來的點(diǎn)子:

◆ 沒有內(nèi)建的集合類型(必須使用map,并檢查是否存在)

◆ 因?yàn)闆]有集合,必須自己寫交集,并集之類的方法

◆ 沒有 tuples 類型,必須寫你自己的結(jié)構(gòu),或者使用 slices (即數(shù)組)

◆ 沒有類似 \__getattr__() 的方法,你必須總是檢查存在性,而不是設(shè)置默認(rèn)值,例如,在 Python 里,你可以這樣寫 value = dict.get(“a_key”, “default_value”)

◆ 必須總是檢查錯(cuò)誤(或者顯式的忽略錯(cuò)誤)

◆ 不能有變量/包沒被使用,因此簡(jiǎn)單的測(cè)試也需要有時(shí)注掉一些代碼

◆ 在 [] byte 和 string 之間轉(zhuǎn)換。 regexp 使用 [] byte (不可變)。這是對(duì)的,但是老把一些變量轉(zhuǎn)換來轉(zhuǎn)換去很煩人

◆ Python 更寬松。你可以使用超出范圍的索引在字符串里取一個(gè)片段,而且不會(huì)出錯(cuò)。你還可以用負(fù)數(shù)取出片段,但是 Go 不行

◆ 你不能混合數(shù)據(jù)結(jié)構(gòu)類型。也許這樣也不太干凈,但是有時(shí)在 Python 里,我會(huì)使用值是混合了字符串和列表的字典。但是 Go 不行,你不得不清理干凈你的數(shù)據(jù)結(jié)構(gòu)或者使用自定義的結(jié)構(gòu)

◆ 不能解包一個(gè) tuple 或者 list 到幾個(gè)不同的變量(例如:x, y, z = [1, 2, 3])

◆ 駝峰式命名風(fēng)格(如果你沒有首字大寫方法名/結(jié)構(gòu)名,他們不會(huì)被暴露給其它的包)。我更喜歡 Python 的小寫字母加下劃線命名風(fēng)格。

◆ 必須顯式檢查是否有錯(cuò)誤 != nil, 不像在 Python 里,許多類型可以像 bool 那樣檢查 (0, “”, None 都可以被解釋成 “非” 集合)

◆ 文檔在一些模塊上太散亂了,例如(crypto/md5),但是 IRC 上的 go-nuts 很好用,提供了巨大的幫助。

◆ 從數(shù)字到字符串的轉(zhuǎn)換(int64 -> string) 和 []byte -> string (只要使用 string([]byte))不太一樣。需要使用 strconv。

◆ 閱讀 Go 代碼比起 Python 那樣寫起來如偽代碼的語言更像一門編程語言, Go 有更多的非字母數(shù)字字符,并且使用 || 和 &&, 而不是 “or”和“and”

◆ 寫一個(gè)文件的話,有 File.Write([]byte) 和 File.WriteString(string), 這點(diǎn)和 Python 開發(fā)者的 Python 之道:“解決問題就一種方法 ”相違背。

◆ 修改字符串很困難,必須經(jīng)常重排 fmt.Sprintf

◆ 沒有構(gòu)造函數(shù),因此慣用法是創(chuàng)建 NewType() 方法來返回你要的結(jié)構(gòu)

◆ Else (或者 else if)必須正確格式化,else 得和 if 配對(duì)的大括號(hào)在同一行。奇怪。

◆ 賦值運(yùn)算符取決于在函數(shù)內(nèi)還是函數(shù)外,例如,= 和 :=

◆ 如果我只想要“鍵”或者只想要 “值”,譬如: dict.keys() 或者 dict.values(),或者一個(gè) tuples 的列表,例如:dict.items(),在 Go 語言里沒有等價(jià)的東西,你只能自己枚舉 map 來構(gòu)造你的列表類型

◆ 我有時(shí)使用一種習(xí)慣用法:構(gòu)造一個(gè)值是函數(shù)的字典類型,我想通過給定的鍵值調(diào)用這些函數(shù),你在 Go 里可以做到,但是所有的函數(shù)必須接受,返回相同的東西,例如:相同的方法簽名

◆ 如果你使用 JSON 并且 你的 JSON 是一個(gè)復(fù)合類型,恭喜你。 你必須構(gòu)造自定義的結(jié)構(gòu)匹配 JSON 塊里的格式,然后把原始 JSON 解析到你自定義結(jié)構(gòu)的實(shí)例中去。比起 Python 世界里 object = json.loads(json_blob) 要做更多的工作

是不是值得?

值得,一百萬倍的值得。速度的提升太多了,以致很難舍棄。同時(shí),我認(rèn)為, Go 是目前趨勢(shì)所在,因此在招新員工的時(shí)候,我認(rèn)為把 Go 當(dāng)作 Repustate 技術(shù)積累的重要一環(huán)會(huì)很有幫助。

上述就是小編為大家分享的Python開發(fā)者在轉(zhuǎn)到Go語言之前需要了解什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI