速度or實用性:Python真的遇到瓶頸了嗎?
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
我是一名Python工程師,所以你可以認為我有偏見。在本文中,我想澄清一些關于Python的批評,并探討在使用Python進行數據工程、數據科學和分析學的日常工作中,我們是否有必要擔憂速度。
Python速度很慢嗎?
在我看來,這類問題應該基于特定的情境和用例提出。與編譯語言(如C語言)相比,Python處理數字的速度慢嗎?是的,慢。這是眾所周知的事實,這就是為什么Python庫在后臺控制著C語言,而在諸如numpy的Python庫中,速度起著重要作用。
但是對于所有用例來說,Python是否比其他(更難學習和使用的)語言慢得多?你若查看為解決特定問題而優化的許多Python庫的性能基準,就會發現它們與編譯語言相比,表現相當不錯。
例如,看看FastAPI的性能基準——顯然,Go作為一種編譯語言要比Python快得多。盡管如此,FastAPI在構建REST API方面還是勝過了一些Go的庫:

我們應該捫心自問的是,我真正需要的速度是多少。如果運行每天只觸發一次的ETL作業,你可能并不關心它需要20秒還是200秒。你可能更傾向于使代碼易于理解、封裝和維護,特別是考慮到與昂貴的工程時間相比,計算資源正變得越來越便宜。
代碼速度與實用性
圖源:unsplash
從實用的角度來看,在為日常工作選擇編程語言時,我們需要回答許多不同的問題。
(1) 你能用這種語言切實解決多個業務問題嗎?
假如你只關心速度,那就別用Python了。各種用例都有更快的替代方案。Python的主要優點在于它的可讀性、易用性,以及能用它解決廣泛問題。Python可以用作橋梁,將無數不同的)系統、服務和用例連接在一起。
(2) 你能找到足夠多的懂這門語言的員工嗎?
Python非常容易學習和使用,所以其用戶數量在不斷增長。以前用Excel處理數字的商業用戶,現在可以很快學會用Pandas編碼,從而自給自足,無需始終依賴IT資源。同時,這消除了IT和分析部門的負擔,也縮短了實現價值的時間。
近些年,比起那些能用Java或Scala做同樣事情的人,你更容易找到那些了解Python并能用這種語言維護Spark數據處理應用程序的數據工程師。許多組織在很多用例中逐漸轉向使用Python,只是因為找到“會說”這種語言的員工的幾率更高。
我知道一些公司非常需要Java或C#開發人員來維護他們現有的應用程序,但這些語言很難(需要很多年才能掌握),而且對于新程序員來說似乎沒有吸引力,因為他們可以用更簡單的語言(如Go或Python)來獲得更多收入。
(3) 不同領域專家之間的協同效應
假如你的公司使用Python,那么商業用戶、數據分析師、數據科學家、數據工程師、后端和web開發人員、DevOps工程師,甚至系統管理員很可能都使用同一種語言。這會引起項目中的協同效應,來自不同領域的人可以一起工作。
數據處理中真正的瓶頸是什么?
在我的工作中,我通常遇到的瓶頸不是語言本身,而是外部資源,來看幾個例子。
(1) 寫入關系數據庫
在以ETL方式處理數據時,最終需要將此數據加載到某個集中位置。盡管可以利用Python中的多線程功能,將數據更快地寫入某些關系數據庫中(通過使用更多線程),但并行寫入操作次數的增加可能會使數據庫的CPU容量使用最大化。
事實上,我在AWS上使用多線程加速RDS Aurora數據庫的寫入操作的時候,這種情況就發生過一次了。我注意到寫入節點的CPU利用率非常高,以至于我不得不通過使用更少的線程來刻意降低代碼的速度,以確保不會破壞數據庫實例。
這意味著Python具有并行化并加快許多操作的機制,但關系數據庫(受CPU核數量的限制)有其局限性,僅通過使用更快的編程語言不太可能解決這個問題。
(2) 調用外部的API
使用外部REST API,你可能是想從中提取數據來滿足數據分析需求,這同樣證明了語言本身似乎不是瓶頸。雖然我們可以通過利用并行性來加速數據提取,但這可能是徒勞的,因為外部API限制了我們在特定時間段內可以發出的請求數量。因此,你可能會刻意讓腳本變慢,來確保不超出API的請求限制:
- time.sleep(10)
(3) 使用大數據
從我處理大量數據集的經驗來看,無論使用哪種語言,都無法將真正的“大數據”加載到筆記本電腦的內存中。對于這樣的用例,你可能需要利用分布式處理框架,如Dask、Spark、Ray等。在使用單個服務器實例或筆記本電腦時,可以處理的數據量是有限制的。
如果你想把實際的數據處理工作轉移到一個計算節點集群中,可能使用GPU實例來進一步加快計算速度,Python剛好有一個龐大的框架生態系統,可以簡化這項任務:
- 你想通過利用GPU來加快數據科學的計算速度嗎?使用Pytorch、Tensorflow、Ray或Rapids吧。
- 你想加快處理大數據的Python代碼的速度嗎?使用Spark(或Databricks)、Dask或Prefect吧(可在后臺將Dask抽象化)。
- 你想加快用以分析的數據處理速度嗎?使用快速專用的內存列數據庫,通過SQL查詢確保高速處理。
如果你需要協調和監視在計算節點集群上發生的數據處理,有幾個用Python編寫的工作流管理平臺,可以加快數據管道的開發和維護,例如Apache Airflow、Prefect或Dagster。
有些抱怨Python的人,其實并沒有充分利用它,或者可能沒有使用適當的數據結構來解決眼前的問題。總而言之,如果你需要快速處理大量數據,那你可能需要更多的計算資源,而不是更快的編程語言,而且有一些Python庫可以輕松地將工作分布到數百個節點上。
圖源:Google
雖然Python比許多編譯語言慢,但它好用且非常多樣化。對許多人來說,語言的實用性勝過速度方面的考量。語言本身可能不是瓶頸,至少在數據工程中是這樣,瓶頸是外部系統和龐大數據量的限制,無論選擇哪種編程語言都無法在單個計算機上進行處理。