尽管速度如此之慢,为什么Python如此受欢迎?
Python很慢和/或它不是的兩個(gè)最常見的原因高性能:
解讀
GIL
第一個(gè)是相當(dāng)直接的,但在高級(jí)別編譯器將更高級(jí)別的語言翻譯成更低級(jí)別(更快)的語言,因此編譯語言幾乎總是比非編譯語言執(zhí)行得更快。這個(gè)經(jīng)驗(yàn)法則有一些例外(例如JIT可能比AOT編譯更快的情況),但它們會(huì)分散討論。
第二個(gè)是更臭名昭著,但是Python有一個(gè)叫做全局解釋器鎖的東西,它通過強(qiáng)制解釋器一次只在一個(gè)進(jìn)程(Python解釋器的實(shí)例)中執(zhí)行單個(gè)線程來基本上防止多線程。它的工作原理也很有趣,但也像編譯器一樣切入兔子洞。
Python性能下降9/10倍并不重要。
隨著時(shí)間的推移,我認(rèn)為有兩個(gè)主要原因。
首先,重要的不是代碼執(zhí)行時(shí)間,而是最終用戶體驗(yàn)。它不一般的問題,如果一個(gè)函數(shù)具有0.001秒或0.01來執(zhí)行。在這種情況下,對(duì)于大多數(shù)問題,可以使用水平擴(kuò)展來解決Python創(chuàng)建的許多瓶頸。
以這些基準(zhǔn)為例對(duì)于流行的Web框架。使用Python的最好的是650.5K req / s,而最好的數(shù)字是2.2M。純粹從性能的角度來看,你可能想知道為什么你不會(huì)選擇最快的,但是你看看那個(gè)#1點(diǎn)并意識(shí)到它正在使用C. C是一種很棒的語言(IMO),但是Python很多更具表現(xiàn)力,擁有更大的生態(tài)系統(tǒng),您可以選擇使用預(yù)先構(gòu)建的工具。因此,在犧牲開發(fā)時(shí)間/范圍的同時(shí),不是從服務(wù)器中擠出最后一點(diǎn)計(jì)算能力,而是可以為每1個(gè)需要C的服務(wù)器獲得4臺(tái)Python服務(wù)器,并節(jié)省開發(fā)人員生產(chǎn)力和開發(fā)時(shí)間的許多倍。這顯然是一個(gè)戲劇性和極其簡化的例子,但我認(rèn)為這一點(diǎn)是合理的。
這讓我們圍繞GIL的第二個(gè)實(shí)現(xiàn)和我的結(jié)論,它確實(shí)并沒有那么糟糕。
通過不允許多線程(或在同一進(jìn)程中同時(shí)執(zhí)行),Python大大簡化了開發(fā)人員面臨的編程復(fù)雜性。 開發(fā)人員可以忽略多線程進(jìn)程的常見 問題和優(yōu)化,因?yàn)镻ython解釋器一次只能執(zhí)行一個(gè)邏輯。
這也通常不會(huì)多大關(guān)系為同一水平推理點(diǎn)1而不是解決與多線程問題,您可以選擇與解決問題的多重處理。您可以啟動(dòng)多個(gè)進(jìn)程并在它們之間進(jìn)行通信,而不是在單個(gè)進(jìn)程中管理多個(gè)線程。差異很微妙,但同樣,對(duì)于這些情況中的9/10,多處理與線程的性能開銷并不重要。
在頭頂性能的情況下做的事情,你可以隨時(shí)“膠水”不同的語言為你的Python邏輯。典型的例子是Numpy如何通過放入C將高性能數(shù)組結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)帶到Python。
那么這一切又是什么呢?
隨著計(jì)算能力(處理器核心的數(shù)量,單個(gè)核心的速度,服務(wù)器硬件的成本等)越來越便宜,大多數(shù)性能問題通常可以通過水平擴(kuò)展來解決。
對(duì)于你無法橫向解決的事情,你可以用不同的語言寫一些東西并將其“粘合”到你的Python邏輯中(假設(shè)Python是一種“膠水”語言)。
因此,如果最終可以增強(qiáng)/處理性能,那么您需要將Python作為一種語言的主要原因:
簡單
生產(chǎn)的
可讀(從而更易于維護(hù))
關(guān)于Python的優(yōu)點(diǎn)和缺點(diǎn),我們可以談?wù)摳嗟膬?nèi)容,我們可以更詳細(xì)地討論,但我認(rèn)為這是解決為什么Python解釋器性能不會(huì)影響其受歡迎程度的問題的良好開端。
文章來于quora總結(jié)
以上是生活随笔為你收集整理的尽管速度如此之慢,为什么Python如此受欢迎?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 童年的飞秋大门已徐徐向我关闭
- 下一篇: 有三角形的即时通讯源码?