新聞中心
Python 真的很慢嗎?這需要具體問(wèn)題具體分析。和 C 等編譯型語(yǔ)言相比,Python 在處理數(shù)字方面速度確實(shí)很慢。這也從側(cè)面說(shuō)明了 Python 中加速數(shù)字處理的庫(kù)(如 numpy)為什么如此重要了。

但是,Python 是不是在所有用例上都比其他編程語(yǔ)言慢呢?并非如此,如果了解一下為解決特定問(wèn)題而優(yōu)化的許多 Python 庫(kù)的性能基準(zhǔn)測(cè)試,你就會(huì)發(fā)現(xiàn) Python 比編譯型語(yǔ)言做得好。以 FastAPI 性能基準(zhǔn)為例,F(xiàn)astAPI 是一個(gè)用于構(gòu)建 API 的現(xiàn)代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于標(biāo)準(zhǔn)的 Python 類(lèi)型提示。Go 語(yǔ)言顯然比 Python 快,不過(guò),F(xiàn)astAPI 在構(gòu)建 REST API 方面勝過(guò)了 Go 的一些庫(kù):
Web 框架基準(zhǔn)測(cè)試,不包括 C++ 和 Java web 框架。
同樣,在比較 Dask(使用 Python 編寫(xiě))與 Spark(使用 Scala 編寫(xiě))處理數(shù)據(jù)密集型神經(jīng)成像 pipeline 時(shí),結(jié)果表明這兩個(gè)引擎之間沒(méi)有實(shí)質(zhì)的性能差異。
代碼速度 VS 實(shí)用性
從實(shí)用的角度來(lái)看,在為日常工作選擇編程語(yǔ)言時(shí),需要回答多個(gè)不同的問(wèn)題。
(1) 問(wèn)題 1:這種語(yǔ)言能夠可靠地解決多項(xiàng)業(yè)務(wù)問(wèn)題嗎?
如果你只關(guān)心速度,那么不要用 Python,各種用例都有更快的替代方案。Python 的主要優(yōu)點(diǎn)在于可讀性、易用性和可解決大量問(wèn)題。Python 可以作為粘合劑,將不同的系統(tǒng)、服務(wù)和用例連接在一起。
(2) 問(wèn)題 2:你能找到足夠多懂這門(mén)語(yǔ)言的員工嗎?
Python 易于學(xué)習(xí)和使用,因此用戶(hù)數(shù)量不斷增長(zhǎng)。以前使用 Excel 處理數(shù)字業(yè)務(wù)的用戶(hù),現(xiàn)在可以很快學(xué)會(huì)用 Pandas 編寫(xiě)代碼,從而學(xué)會(huì)在不依賴(lài) IT 資源的情況下實(shí)現(xiàn)自給自足。同時(shí),這也緩解了 IT 和分析部門(mén)的負(fù)擔(dān)。
如今,企業(yè)更容易找到會(huì) Python、并能用這種語(yǔ)言維護(hù) Spark 數(shù)據(jù)處理應(yīng)用程序的數(shù)據(jù)工程師,而不是用 Java 或 Scala 做同樣工作的人。許多組織在很多用例中逐漸轉(zhuǎn)向使用 Python,因?yàn)槎?Python 的員工更容易找到。
相比之下,一些公司迫切需要 Java 或 C# 開(kāi)發(fā)人員來(lái)維護(hù)他們現(xiàn)有的應(yīng)用程序,但這些語(yǔ)言很難(需要數(shù)年才能掌握),而且對(duì)于新手程序員來(lái)說(shuō)似乎沒(méi)有吸引力,他們可能使用更簡(jiǎn)單的語(yǔ)言(如 Go 或 Python)在工作中掙到更多的錢(qián)。
(3) 問(wèn)題 3:不同領(lǐng)域?qū)<抑g的協(xié)同效應(yīng)
如果你的公司使用 Python,那么業(yè)務(wù)用戶(hù)、數(shù)據(jù)分析師、數(shù)據(jù)科學(xué)家、數(shù)據(jù)工程師、后端和 web 開(kāi)發(fā)人員、運(yùn)維工程師甚至系統(tǒng)管理員很可能使用同一種語(yǔ)言。這將在項(xiàng)目中產(chǎn)生協(xié)同效應(yīng),來(lái)自不同領(lǐng)域的人可以一起工作并利用相同的工具。
數(shù)據(jù)處理的真正瓶頸是什么?
在平時(shí)的工作中,通常我們遇到的瓶頸不是語(yǔ)言本身,而是外部資源。讓我們看幾個(gè)例子。
(1) 示例 1:寫(xiě)入關(guān)系型數(shù)據(jù)庫(kù)
當(dāng)以 ETL 方式處理數(shù)據(jù)時(shí),最終我們需要將這些數(shù)據(jù)加載到某個(gè)集中的地方。雖然我們可以利用 Python 中的多線程,更快地將數(shù)據(jù)寫(xiě)入某些關(guān)系型數(shù)據(jù)庫(kù),但并行寫(xiě)入次數(shù)的增加可能會(huì)使該數(shù)據(jù)庫(kù)的 CPU 容量達(dá)到極限。
這意味著 Python 具備并行化和加速操作的機(jī)制,但是關(guān)系型數(shù)據(jù)庫(kù)(受 CPU 核數(shù)的限制)有其局限性,僅通過(guò)更快的編程語(yǔ)言很難解決。
(2) 示例 2:調(diào)用外部 API
另一個(gè)例子是使用外部 REST API,以提取數(shù)據(jù)來(lái)滿(mǎn)足數(shù)據(jù)分析需求,這一案例中語(yǔ)言本身似乎并不是瓶頸。雖然我們可以利用并行加速來(lái)提取數(shù)據(jù),但這可能是徒勞的,因?yàn)樵S多外部 API 限制了在特定時(shí)間段內(nèi)發(fā)出請(qǐng)求的數(shù)量。因此,我們會(huì)故意讓腳本變慢,以確保不會(huì)超過(guò) API 的請(qǐng)求限制:
- time.sleep(10)
(3) 示例 3:處理大數(shù)據(jù)
從處理超大數(shù)據(jù)集的經(jīng)驗(yàn)來(lái)說(shuō),無(wú)論用什么語(yǔ)言你都不能直接用筆記本內(nèi)存來(lái)負(fù)載大數(shù)據(jù)。這種情況下,你需要利用 Dask、Spark、Ray 等分布式處理框架。在使用單個(gè)服務(wù)器實(shí)例或者筆記本時(shí),處理的數(shù)據(jù)量存在限制。
如果你想把實(shí)際的數(shù)據(jù)處理工作轉(zhuǎn)移到一個(gè)計(jì)算節(jié)點(diǎn)集群中,甚至使用 GPU 來(lái)加速計(jì)算,Python 恰好有一個(gè)龐大的框架生態(tài)系統(tǒng),使這個(gè)任務(wù)變得更容易:
- 你是否想用 GPU 來(lái)加快數(shù)據(jù)科學(xué)的計(jì)算速度?使用 PyTorch、TensorFlow、Ray 或 Rapids(甚至 SQL - BlazingSQL)。
- 你是否想加速 Python 代碼處理大數(shù)據(jù)的速度?使用 Spark(或 Databricks)、Dask 或 Prefect。
- 你是否想加快數(shù)據(jù)分析的處理速度?使用快速的專(zhuān)用內(nèi)存列數(shù)據(jù)庫(kù),通過(guò)使用 SQL 查詢(xún)確保高速處理。
此外,如果你需要協(xié)調(diào)、監(jiān)測(cè)計(jì)算節(jié)點(diǎn)集群上發(fā)生的數(shù)據(jù)處理,你有 Apache Airflow、Prefect 或 Dagster 等多個(gè) Python 工作流管理平臺(tái)可供選擇,它們可以加速數(shù)據(jù) pipeline 的開(kāi)發(fā)和維護(hù)。
順帶提一下,一些人可能會(huì)抱怨 Python 沒(méi)有充分利用其能力或者未對(duì)手頭問(wèn)題使用合適的數(shù)據(jù)結(jié)構(gòu)。
總而言之,如果你需要快速處理大量數(shù)據(jù),那你更需要的是計(jì)算資源而不是快速的編程語(yǔ)言,而且一些 Python 庫(kù)能夠輕松實(shí)現(xiàn)在數(shù)百個(gè)節(jié)點(diǎn)上的分布式工作。
網(wǎng)站名稱(chēng):為Python正名:語(yǔ)言本身不是瓶頸,可能是外部資源出了問(wèn)題
文章轉(zhuǎn)載:http://www.5511xx.com/article/djscgje.html


咨詢(xún)
建站咨詢(xún)
