作者 | JOS VISSER
編譯 | 王瑞平
最近,大家總在吐槽Python:“雖然它是一種不錯(cuò)的語(yǔ)言,但不適用于專業(yè)領(lǐng)域。”
圖片
數(shù)據(jù)顯示:Python依然排名第一,占比13.33%;C語(yǔ)言緊隨其后,排行第二,占比11.41%;C++位列第三,占比10.63%,與C語(yǔ)言差距為0.78%。
圖片
此外,Java和C#分別排在第四和第五位,占比分別為10.33%和7.04%。JavaScript在本月依然保持榜單第六位,占比為3.29%。
雖然Python如此受歡迎,但它能否持續(xù)流行依舊是一個(gè)重大問(wèn)題,很多用戶普遍認(rèn)為,如果持續(xù)使用將會(huì)使行業(yè)倒退好幾年。
Python對(duì)于開(kāi)發(fā)大型應(yīng)用程序不太友好,在工程化實(shí)踐中需要特殊的技術(shù)支持。
“我曾用Python編寫過(guò)大型應(yīng)用程序很多年。由于Python入門非常簡(jiǎn)單,在編寫大型應(yīng)用程序時(shí)就像用樂(lè)高積木構(gòu)建核反應(yīng)堆一樣。”原作者在文章中形象地比喻道。
“但是,現(xiàn)在‘反應(yīng)堆’已經(jīng)運(yùn)行很久,輻射泄漏到處都有,我們需要到處‘貼新磚’讓‘反應(yīng)堆’持續(xù)運(yùn)轉(zhuǎn)。”
實(shí)際上,目前唯一能做的就是將“反應(yīng)堆”封裝在混凝土中讓它冷卻下來(lái),然后再用合適的建筑材料構(gòu)建出一個(gè)新的。
認(rèn)為“Python無(wú)法開(kāi)發(fā)大型應(yīng)用程序”的網(wǎng)友認(rèn)為它“不太友好”,在工程化實(shí)踐中需要特殊技術(shù)支持。
圖片
也有反對(duì)者認(rèn)為:在大型項(xiàng)目中,與影響更大的其它因素相比,編程語(yǔ)言的語(yǔ)法、語(yǔ)義、范式等幾乎無(wú)關(guān)緊要。團(tuán)隊(duì)經(jīng)驗(yàn)和熟悉度、開(kāi)發(fā)管理、流程、實(shí)踐、支持工具、文檔、語(yǔ)言生態(tài)系統(tǒng)、語(yǔ)言成熟度、管理支持等都會(huì)對(duì)項(xiàng)目結(jié)果產(chǎn)生更大的影響。
另外,從技術(shù)層面來(lái)講,質(zhì)疑Python無(wú)法開(kāi)發(fā)大型編程語(yǔ)言只能反映提問(wèn)者對(duì)相關(guān)開(kāi)發(fā)缺乏了解。這些質(zhì)疑一是源于Python的動(dòng)態(tài)類型特性,使類型推斷變得困難,對(duì)代碼的靜態(tài)檢查和重構(gòu)十分不利;二是由于Python代碼沒(méi)有編譯過(guò)程,因此缺少編譯時(shí)檢查錯(cuò)誤機(jī)制。
關(guān)于動(dòng)態(tài)類型特性質(zhì)疑,Python從3.3版本起就引入類型聲明,因此,只要遵循規(guī)范編寫代碼,類型推斷和代碼重構(gòu)就不是問(wèn)題。
不久前,ChatGPT的問(wèn)世也證明了Python可以寫出高性能、可擴(kuò)展性強(qiáng)的大型分布式計(jì)算平臺(tái)—Ray。目前,這個(gè)平臺(tái)已匯聚超過(guò)1億的月活躍用戶。
“糟糕的應(yīng)用程序架構(gòu)是絕大多數(shù)應(yīng)用產(chǎn)生性能瓶頸的原因,而不應(yīng)該由開(kāi)發(fā)語(yǔ)言來(lái)背黑鍋。”有些評(píng)論者這樣認(rèn)為。
誠(chéng)然,Python與其它開(kāi)發(fā)語(yǔ)言相比,在運(yùn)行速度方面確實(shí)落后不少。究其根源,還是由于Python之父認(rèn)為不需要過(guò)多關(guān)注Python的速度問(wèn)題,認(rèn)為它已經(jīng)足夠快了。
確實(shí),對(duì)于99%以上的任務(wù)來(lái)說(shuō),Python的速度夠快,快到足以支撐早期Google和Dropbox。
自那時(shí)起,Python的速度又有了顯著提升,但開(kāi)發(fā)者仍要求Python運(yùn)行得更快。因?yàn)椋瑹o(wú)論人們已經(jīng)使用Python構(gòu)建出算力多么驚人的計(jì)算平臺(tái),它的計(jì)算能力在很多場(chǎng)景下依然更慢。
當(dāng)然,Python是一種靈活的和duck類型的語(yǔ)言:我們鍵入代碼、保存它,然后僅在運(yùn)行時(shí)才能根據(jù)輸入的數(shù)據(jù)確定語(yǔ)句始終有效、有時(shí)有效還是根本不可能實(shí)現(xiàn)。
此外,你在用Python編寫程序時(shí),只能部分控制進(jìn)入該函數(shù)的數(shù)據(jù),需要嚴(yán)格檢查所有輸入的數(shù)據(jù)。
更糟糕的是,Python的duck式輸入方式可能會(huì)引入“可怕”代碼,這會(huì)帶來(lái)麻煩。
我在用Python編寫大型應(yīng)用程序的這些年里,經(jīng)歷過(guò)一些可怕的事情;如果這些應(yīng)用程序是用理性的、安全的語(yǔ)言編寫的,這些事就不會(huì)發(fā)生。
*在幾年前的一個(gè)例子中,我設(shè)法說(shuō)服組織用Rust重寫系統(tǒng),效果非常不錯(cuò)!
實(shí)際上,我曾多次在社區(qū)中發(fā)布用Python編寫的大型應(yīng)用程序新版本,結(jié)果卻立即被錯(cuò)誤“吞噬”;這些錯(cuò)誤都是由Python代碼異常導(dǎo)致的。
*Python的捍衛(wèi)者會(huì)說(shuō),這不是語(yǔ)言的缺陷,而是代碼審查和測(cè)試方法的缺陷。
*他們錯(cuò)了!理論上,測(cè)試方法主要是查看每一行代碼并檢查每個(gè)輸入和場(chǎng)景,但實(shí)際上這并不可能!
好的編程語(yǔ)言的特點(diǎn)之一是:你不必檢查和測(cè)試內(nèi)存中每個(gè)相關(guān)位置的排列;如果必須詳盡地檢查和測(cè)試每個(gè)“a=b+c”,程序?qū)⒖赡苡肋h(yuǎn)無(wú)法應(yīng)用于實(shí)踐。
我會(huì)經(jīng)常查看Python函數(shù),并想了解是否有人實(shí)際調(diào)用了它們以及攜帶了哪些參數(shù)。
我也經(jīng)常不得不“求助”代碼庫(kù)的全文搜索功能尋找調(diào)用位置;不幸的是,即便沒(méi)有輸出任何結(jié)果,當(dāng)我刪除相應(yīng)函數(shù)時(shí),程序依然會(huì)崩潰;就算程序沒(méi)有立即崩潰,也無(wú)法判斷程序是否會(huì)在某種情況下崩潰。
用Python的另一個(gè)問(wèn)題是內(nèi)存。我的筆記本電腦有10個(gè)CPU內(nèi)核,其中,Python應(yīng)用程序大約占用1.2個(gè)。
這該怎么辦呢?幸運(yùn)的是,我可以在Python中使用分叉工作進(jìn)程的功能處理請(qǐng)求,確保所有核心都能正常使用。
不幸的是,分叉進(jìn)程的操作很快就耗盡了內(nèi)存,所以我決定在處理完一定數(shù)量的請(qǐng)求后自行終止分叉,然后由Linux進(jìn)行內(nèi)存管理。雖然這并不是Python本身的問(wèn)題,但Python使內(nèi)存管理變得更加糟糕。
分叉工作進(jìn)程還有另一個(gè)影響:Python使用引用計(jì)數(shù)法擊敗了寫時(shí)復(fù)制。為控制引用計(jì)數(shù),保存只讀變量的內(nèi)存塊也被寫入,從而耗費(fèi)了一定的內(nèi)存。
解決這個(gè)問(wèn)題的有效方法是:讓編譯器對(duì)所有由主進(jìn)程創(chuàng)建和由worker進(jìn)程繼承的變量使用參考數(shù)值,而不必觸及到具有該參考數(shù)值的引用計(jì)數(shù)。
這是超級(jí)聰明的解決方案,但我認(rèn)為應(yīng)該沒(méi)這個(gè)必要。如果你需要破解編譯器才能讓Python為你所用,那這種語(yǔ)言又有什么用呢?
總之,Python使編寫可靠、易于維護(hù)和快速的代碼變得非常困難。
當(dāng)我對(duì)Python忍無(wú)可忍之時(shí)就會(huì)轉(zhuǎn)向Go,它使用起來(lái)幾乎與Python同樣容易、安全,還能快速構(gòu)建系統(tǒng)并生成高度優(yōu)化的二進(jìn)制本機(jī)代碼文件。
雖然Go也并不是完美的,但是,如果你想可靠和快速地編寫代碼,并在代碼失控時(shí)可以調(diào)試和重構(gòu),Go比Python好很多!
https://www.zhihu.com/question/321166662/answer/2937406779?utm_id=0
https://www.zhihu.com/question/321166662/answer/2937406779
本文鏈接:http://www.www897cc.com/showinfo-26-5699-0.html到底該不該使用Python?
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com