Python創始人訪談:Python沒想象中的那麼慢

cpplover發表於2012-05-10

原文(第一次翻譯訪談類文章,裡面口語化東西如果處理得不好請不吝賜教,我盡力把意思表達清楚。)

Guido van Rossum創造了Python語言(當下流行的動態語言之一,Google和NASA這樣的組織都在使用)。上週日,Google資深軟體工程師van Rossum出席了在矽谷的PyCon會議,並與我們InfoWorld編輯Paul Krill探討了Python的成長和質疑。

InfoWorld: 你曾經回答過那些批評Python太慢的人。你說:每當你需要用Python寫點什麼時候,都覺得它已經足夠快了。(既然如此)為什麼還有質疑它太慢的批評之聲呢?

van Rossum: 人們通常會那麼做:他們找一個工具,然後把它打造得不可思議。在這不可思議軟體的某一部分,他們正在幹著瘋狂的事情,有的時候一些瘋狂的事情包括一個完整的計算分支,比如遍歷一個有十億節點的圖或者分析百萬兆的email資訊等等。

有些時候,會因為系統的一小部分原因而中止整個系統。如果你僅僅寫一些頭腦簡單的Python迴圈語句,可能會發現那就是你係統的瓶頸。我們通常可以把那部分用很少的C或C++替換掉,而不是用一個更快的語言重寫整個系統,因為大多數你所做的事情與程式語言的速度無關。

InfoWorld: Python語言目前的最新版本是多少?

van Rossum: 目前有兩個不同的版本。我們正在嘗試最終將這兩個版本統一在一起。我們正在嘗試砍掉Python 2的分支,所以在Python 2分支上的最後一片葉子是Python 2.7。但是現在你仍可以看到許多Python 2.6和2.5的分支。在Python 3的分支上,目前的釋出版本是3.2,最近幾個月我們僅僅釋出了一個3.3的alpha版,3.3不久會正式釋出。

InfoWorld: Python 3分支最吸引人的地方在哪裡?

van Rossum: Python 2已經累計了許多方式去做同一件事情。同樣,Python 2已經引入了一種處理Unicode的方式;在2000版本引入它時,我們對於能夠支援Unicode並且能夠向後相容表示非常自豪。過了06至07年之後,我們意識到需要一種完全不同的方式去處理Unicode。同樣我們找不到一種能讓新的正確支援Unicode的方法與過去版本語言相容。

因為這件事,我們想:與其發一個受到嚴格相容限制的版本,不如直接做一個新的釋出版(Python 3)。之後,我們清理了一堆東西,丟掉了許多過時的特性。雖然使用者被告知Python 3不與Python 2相容,但是它們依然“像”是同一門語言【1】。

InfoWorld: 如果不相容的話,你是否不得不重新編譯Python 2的應用?(譯註:小編貌似不太熟悉動態語言,動態語言是不需要編譯的--至少不需要自己來編譯)

van Rossum: 大多數情況下,你不得不修改該原有的Python 2應用的程式碼。我們提供了一個從2升級到3的工具,它可以自動完成大多數的改動。但是仍有許多事情是不能自動化的,所以你必須手動修訂。因此,人們按照一些策略,編寫受限制的Python 2程式碼(通過不適用某些特性),然後他們的程式碼就魔術般地相容了Python 3。

InfoWorld: 你談到關於反對動態型別的爭執。你說:如果你相信編譯器可以找到程式中的所有bug,那你幹軟體開發一定沒多久。所以你對Python的動態性感到很滿意是麼?

van Rossum: 完全如此。程式語言的基本哲學就是:不要去修改。我從沒看到Python突然增加了某個靜態特性或者有向這方面發展的特性。

InfoWorld: 你提到過:從某些角度上來說,你希望對python程式進行一個全域性的靜態分析【2】將會是很現實的。這麼做對Python開發者有什麼好處?

van Rossum: 全域性靜態分析能幫你找到某種型別的bug。另一件你可以做的事情是優化。

InfoWorld: Python的GIL【3】(Global Interpreter Lock)是否是一個多核處理時的障礙?

van Rossum: 或多或少有一點。如果你使用多核處理器,就不能並行地執行Python位元組碼,因為Python位元組碼需要GIL才能執行,而只有一個核可以擁有GIL。當Python執行緒沒有獲得GIL的時候,它們能做的也只有等待I/O,或者也可以呼叫C/C++程式碼。

舉個例子,在NumPy中做大型矩陣操作,當你給NumPy一個矩陣或者大型陣列時,然後你可以讓它完成1000個資料計算,NumPy會釋放GIL。我不清楚NumPy是否有並行機制,但是你可以想象,如果有10個核,你可以把工作並行在10個核上,每個核上處理不同的資料塊,沒有一個核需要GIL,因為它們都不會處理Python物件。

譯註: 【1】Python的版本:Python的兩大版本是讓很多初學者頭疼的東西。Python 2和Python 3還是有不少差異的,這就導致兩個版本是沒法互相相容的。目前的很多開源工程還是基於Python 2系列來寫的。 【2】靜態分析:在不執行程式碼的情況下對程式碼進行檢查,寫過Java的同學應該知道,比如FindBugs。這些工具主要檢查程式碼中有沒有明顯的bug,比如死迴圈,使用一個沒賦值的變數,等等。 【3】GIL:Python虛擬機器的一個核心部件,稱為全域性直譯器鎖,Python的位元組碼只有獲得GIL才能執行,而GIL一個Python虛擬機器只有一個,所以理論上說,同一時刻,只有一個Python程式能執行。當然Python同樣有執行C/C++語言的能力,執行這些程式碼不需要獲得GIL。GIL是Python語言中一個爭議很大的東西。

相關文章