摘要:如果你只對(duì)開發(fā)者需要了解的事感興趣,請(qǐng)下拉到早該知道的事板塊。在不泄露機(jī)密的情況下,利用支持向量機(jī)來獲取一個(gè)句子最可能的意思,并且以此來推斷句子的情感。也就是說,如果一個(gè)文檔包含個(gè)詞,就會(huì)與支持向量機(jī)進(jìn)行多次對(duì)比。
【編者按】本文最早由 Repustate 發(fā)布,主要介紹將代碼遷移至 Go(lang) 時(shí)的注意事項(xiàng)。文章系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn),以下為正文。
這是一篇講述將大塊 Python/Cython 代碼遷移到 Go 的長(zhǎng)文章。如果你想了解整個(gè)事情的經(jīng)過、背景等所有信息,請(qǐng)讀下去。如果你只對(duì) Python 開發(fā)者需要了解的事感興趣,請(qǐng)下拉到早該知道的事板塊。
背景我們?cè)?Repustate 最大的技術(shù)成果就是實(shí)現(xiàn)了阿拉伯語情感分析。阿拉伯語是個(gè)難啃的硬骨頭,因?yàn)榘⒗Z詞匯的形式非常復(fù)雜。阿拉伯語的標(biāo)記化(把一句話拆分成單個(gè)單詞)也比英語要難得多,因?yàn)榘⒗畣卧~內(nèi)部可能會(huì)包含空格(例如單詞內(nèi)部“aleph”的位置)。在不泄露機(jī)密的情況下,Repustate 利用支持向量機(jī)(SVM)來獲取一個(gè)句子最可能的意思,并且以此來推斷句子的情感。我們一共采用了22種模型(22個(gè)支持向量機(jī)),文檔中的每個(gè)詞都會(huì)被分析。也就是說,如果一個(gè)文檔包含500個(gè)詞,就會(huì)與支持向量機(jī)進(jìn)行10000多次對(duì)比。
PythonRepustate 幾乎完全是用 Python 搭建的,我們使用 Django 來搭建 API 接口和網(wǎng)站架構(gòu)。因此,為了保持代碼一致性,使用 Python 來實(shí)現(xiàn)所有阿拉伯語情感引擎才說得通。就原型設(shè)計(jì)和實(shí)現(xiàn)流程而言,Python 依然是一個(gè)很好的選擇:表現(xiàn)能力優(yōu)秀,又有強(qiáng)大的第三方庫資源,等等。如果是服務(wù)于網(wǎng)頁,它就是最佳選擇。如果是稍低級(jí)別的運(yùn)算,需要與哈希表(Python 中的字典)進(jìn)行大量對(duì)比時(shí),運(yùn)行速度就會(huì)慢下來。我們一秒鐘只能處理2到3個(gè)阿拉伯語單詞,這種速度太慢了。相比之下,我們的英語情感引擎每秒能處理500個(gè)單詞。
瓶頸因此,我們啟動(dòng)了 Python 分析器,開始調(diào)查速度慢的原因。還記得上文提到我們有22個(gè)支持向量機(jī),每個(gè)單詞都會(huì)通過它們處理嗎?原來這個(gè)過程是按順序進(jìn)行,而不是并行的。好了,第一個(gè)想法是換成類似分布式計(jì)算系統(tǒng)(map/reduce)的處理器。長(zhǎng)話短說:Python 不適合用 map/reduce。當(dāng)你需要并發(fā)性的時(shí)候,Python 并不能幫上忙。在 Pycon 2013大會(huì)中,Guido 談到了 Tulip,他希望用來解決這個(gè)問題的一個(gè)新項(xiàng)目,但是還要過一段時(shí)間才能發(fā)布??墒?,如果已經(jīng)有了更好的選擇,為什么還要苦等下去呢?
選擇 Golang 還是回老家(Go Home)在 Mozilla 的朋友告訴筆者,Mozilla 服務(wù)的日志架構(gòu)大部分代碼都已遷移到 Go,部分原因是 goroutines 超級(jí)便利。Go 是由谷歌員工開發(fā)的,設(shè)計(jì)之初就將并發(fā)需求列為一級(jí)理念,而不是像 Python 的眾多解決方案一樣在做事后補(bǔ)救。因此我們開始著手實(shí)現(xiàn)從 Python 到 Go 的遷移。
雖然 Go 代碼還沒實(shí)現(xiàn)大規(guī)模產(chǎn)出,得到的結(jié)果已經(jīng)非常振奮人心。我們現(xiàn)在一秒鐘能處理1000個(gè)文檔,使用的內(nèi)存大大減少,而且也不用再去調(diào)試和解決使用 Python 時(shí)會(huì)遇到的多進(jìn)程/協(xié)程(gevent)/“為什么 Control-C 殺死了我的進(jìn)程”等問題。
喜歡 Go 的原因任何略懂編程語言的人(明白解釋與編譯、動(dòng)態(tài)與靜態(tài)區(qū)別)都會(huì)說:“哈,顯然 Go 要快多了?!睕]錯(cuò),我們是可以用 Java 重寫所有內(nèi)容,并且取得類似的效果,但是這并不是 Go 勝出的原因。你用 Go 寫的代碼似乎一出來是正確的。筆者也說不清楚,但是不知怎么的,一旦代碼被編譯(編譯過程非常迅速),你就會(huì)感覺它能工作了(不只是運(yùn)行不出錯(cuò),而且還邏輯正確)。這聽起來很含糊,但是它是真的。在冗余或無冗余方面,它跟 Python 相似,它把函數(shù)當(dāng)做一級(jí)對(duì)象,因此函數(shù)編程很方便。而且毋庸置疑,goroutines 和 channels 會(huì)讓你更加省心省力。靜態(tài)類型還會(huì)帶來極大的性能提升,以及更精確的內(nèi)存分配控制,但是又不會(huì)損失太多表達(dá)性。
早該知道的事除去溢美之詞,跟 Go 打交道需要與 Python 完全不同的一套思維模式。以下列出的是筆者在遷移時(shí)做的一些筆記——都是在從 Python 遷移到 Go 時(shí)隨機(jī)想到的一些東西:
沒有內(nèi)建的集合類型(需要使用 map,然后測(cè)試存在性)
由于沒有集合類型,需要自己寫代碼來實(shí)現(xiàn)交集、并集等方法
無元組(tuple),必須自己寫架構(gòu)或使用切片(slice)(數(shù)組)
沒有類似 getattr_() 的方法,因此需要不斷檢查存在性,而不能像在 Python 中那樣設(shè)置缺省值:value = dict.get(“a_key”, “default_value”)
必須不斷檢查錯(cuò)誤(至少需要顯式忽略它們)
不能包含未使用的變量或包,因此有時(shí)候如果要測(cè)試一些簡(jiǎn)單問題,需要給代碼添加注釋
在 []byte 和 string 之間切換。正則表達(dá) (regexp) 使用 []byte (可變)。這說得通,但是在一些變量之間來回切換還是很煩人
Python 更為寬松。你可以用超出范圍的索引來索取字符串片段,也不會(huì)有什么問題,還可以提取負(fù)值片段,但是 Go 就不行
不能使用混合類型的數(shù)據(jù)結(jié)構(gòu)。也許不合規(guī)定,但是有時(shí)候在 Python 可以使用混合字符串和列表的字典。在 Go 就不行,要么清理干凈數(shù)據(jù)結(jié)構(gòu),要么自定義結(jié)構(gòu)。感謝 Ralph Corderoy 向筆者展示了如何正確操作(用這個(gè)界面,盧克)
http://play.golang.org/p/SUgl7wd9tk
不能把元組或列表分解成分開的變量(如 x,y,x = [1,2,3])
駝峰字規(guī)則(UpperCamelCase)(如果一個(gè)包中的函數(shù)或結(jié)構(gòu)首字母未大寫,就不會(huì)暴露給其他包)。筆者更喜歡 Python 的小寫加下劃線格式(lower_case_with_underscores)
需要顯式檢查錯(cuò)誤是否為 != nil,不像 Python 有很多類型可以用于布爾型檢查(0,“”,None 都會(huì)被解讀為“假”)
某些模塊(如 crypto/md5)的文檔不足,但是 IRC 上面的 go-nuts 非常棒,擁有特別好的支持
從數(shù)字到字符串的類型轉(zhuǎn)換(int64 -> 字符串)跟[]byte -> 字符串(只用字符串([]byte))不同,需要用到 strconv
Go 的代碼讀起來更像是編程語言,而 Python寫出來更像偽代碼。Go 包含更多非數(shù)字字母字符,用 || 和 && 來表示“或”與“和”
寫文件會(huì)有 File.Write([]byte) 和File.WriteString(string),這會(huì)讓習(xí)慣了 Python
只有一種做事方法的開發(fā)者們有些不適應(yīng)
字符串插入很麻煩,不得不經(jīng)常使用 fmt.Sprintf
沒有構(gòu)造函數(shù),常見的做法是創(chuàng)建 NewType() 函數(shù),來返回你需要的結(jié)構(gòu)
Else 或 else if 必須格式正確,else 得跟 if 從句的大括號(hào)在一行。這很奇怪。
根據(jù)函數(shù)內(nèi)外位置,使用不同的賦值操作符,例如 = 和 :=
如果只想要類似dict.keys() 或dict.values()得到的鍵值或取值列表,或者通過
dict.items()得到的元祖列表,在 Go 里面是無法實(shí)現(xiàn)的,只能自行迭代 map,然后創(chuàng)建自己的列表
筆者習(xí)慣建立一個(gè)取值為函數(shù)的字典,并通過鍵值調(diào)用函數(shù)。你可以在 Go
里面這么做,但是所有的函數(shù)都得接受和返回同樣的東西,也就是說,必須具備同樣的方法簽名
如果你是用 JSON, 而且是混合類型的 JSON,那么你還是自求多福吧。你得創(chuàng)建一個(gè)能夠匹配你的 JSON 二進(jìn)制大對(duì)象(blob)格式的個(gè)性化結(jié)構(gòu),然后解組(Unmarshall)原始 JSON 成為你的個(gè)性化架構(gòu)的一個(gè)用例。比起在 Python 中的一句“obj = json.loads(json_blob)”要費(fèi)更多功夫
這么折騰值得嗎?值,一百萬個(gè)值,超值。速度的提升不容忽視。而且筆者認(rèn)為這也是促使 Go 成為流行語言的重要原因。因此在招聘時(shí),筆者認(rèn)為把 Go 當(dāng)成 Python 開發(fā)者的必備技能也很重要。
原文地址 https://blog.repustate.com/migrating-code-from-python-to-golang-what-you-need-to-know/
本文轉(zhuǎn)自 OneAPM 官方博客
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37969.html
摘要:在本次受訪者中,也有的開發(fā)者表示主要使用框架。這不剛發(fā)布了三個(gè)月,就已進(jìn)入了特性凍結(jié)階段。根據(jù)官方統(tǒng)計(jì),有的開發(fā)人員使用進(jìn)行單元測(cè)試,而的人使用。此外,與開發(fā)者有所不同,開發(fā)者更習(xí)慣使用。對(duì)于語言的使用,表示,多數(shù)人使用單個(gè)全局。 showImg(https://upload-images.jianshu.io/upload_images/13825820-feaee185c3c95b...
摘要:微軟已經(jīng)很久沒有支持開源社區(qū)了,這也是很多公司不采用的原因之一。當(dāng)然微軟總是致力于提供無的工具簡(jiǎn)單的語法和良好的教程,他們最近也意識(shí)到,開源可以為提供更多的創(chuàng)新和業(yè)務(wù)。 得益于CTO、CEO和CDO們積極的推動(dòng),IT基礎(chǔ)設(shè)施正在向云環(huán)境遷移,底層架構(gòu)師則在熱烈討論圍繞著云原生應(yīng)用的SaaS、PaaS和微服務(wù)架構(gòu),而開發(fā)者們正在大顯身手,努力探索云計(jì)算的魔盒,找出什么是對(duì)業(yè)務(wù)有價(jià)值的,什...
摘要:因?yàn)閭鹘y(tǒng)的數(shù)據(jù)庫管理方式在當(dāng)前這種架構(gòu)下依靠手工或者借助簡(jiǎn)單的工具是無法應(yīng)對(duì)多活架構(gòu)大規(guī)模管理帶來的復(fù)雜性,因此平臺(tái)化顯得非常重。我們?cè)谧龅姆桨笗r(shí)做了充分調(diào)查及論證,最終沒有選擇這種方式。 蔡鵬,2015年加入餓了么,見證了餓了么業(yè)務(wù)&技術(shù)從0到1的發(fā)展過程,并全程參與了數(shù)據(jù)庫及DBA團(tuán)隊(duì)高速發(fā)展全過程。同時(shí)也完成個(gè)人職能的轉(zhuǎn)型-由運(yùn)維DBA到DEV-DBA的轉(zhuǎn)變,也從DB的維穩(wěn)轉(zhuǎn)變到專心為...
摘要:經(jīng)過與阿里云工程師的溝通決定使用阿里云的遷云工具來完成這次遷移。出現(xiàn)之后,打開阿里云控制臺(tái),你會(huì)發(fā)現(xiàn)多了三個(gè)快照和一個(gè)鏡像然后用這個(gè)鏡像直接購買實(shí)例就可以了。 摘要: ERP物理機(jī)遷移至阿里云實(shí)踐 機(jī)房選型 隨著公司的不斷發(fā)展,業(yè)務(wù)量逐漸增大,對(duì)信息化的要求也越來越高,隨之對(duì)信息部的要求也越來越多,為此公司決定對(duì)現(xiàn)有的信息系統(tǒng)進(jìn)行升級(jí)改造. ERP物理機(jī)遷移至阿里云實(shí)踐 一、機(jī)房選...
摘要:年月宣布支持時(shí)間延長(zhǎng)到年。更詳細(xì)的發(fā)布列表參閱官網(wǎng)的版本號(hào)分為三段,形如。其中表示大版本號(hào),一般當(dāng)整體重寫,或出現(xiàn)不向后兼容的改變時(shí),增加表示功能更新,出現(xiàn)新功能時(shí)增加表示小的改動(dòng)如修復(fù)了某個(gè),只要有修改就增加。年公司正式發(fā)布。 < 返回索引頁 Python語言簡(jiǎn)介 Python介紹及發(fā)展 介紹 Python 官方網(wǎng)站:https://www.python.org/, 大家可以到此處下...
閱讀 667·2023-04-25 18:37
閱讀 2819·2021-10-12 10:12
閱讀 8432·2021-09-22 15:07
閱讀 591·2019-08-30 15:55
閱讀 3205·2019-08-30 15:44
閱讀 2222·2019-08-30 15:44
閱讀 1651·2019-08-30 13:03
閱讀 1586·2019-08-30 12:55