1. 程式人生 > >python與c/c++相比的優勢

python與c/c++相比的優勢

        理論上,python的確比C/C++慢(我對Java的開發沒有經驗,無法評論)。這一點不用質疑。 C/C++是編繹語言,直接使用的是機器指令,而python總是跑在的虛擬機器上, 把一個邏輯直接轉換為機器指令,和把同樣的邏輯轉換為位元組碼,然後再轉換為機器碼來執行相比, 總是要高上一大截,這一點,有各種各樣的效能報告,我沒有必要,也沒有必要去做出這樣一個報告來, 我記得大概的數值是一到兩個數量級,用C++的話來說,這就是所謂的抽象懲罰。

        但實踐上,並非這麼簡單。 現實開發者領域,總是新手遠多於高手,而從新手轉為高手的時間相比,C/C++使用者花費的時間要比Python使用者多的多,保守的估計是5~10倍。

        這有兩方面原因,一方面, C/C++(尤其是C++)的確是“博大精深”,而且總是有無窮無盡的細節,如果你是一個真正的開發者,你就會明白,實際上,就完全精通C/C++編繹器的選項,就足夠學兩門python了(一點都不誇張,我遇到很多做兩三年的C++開發者,遇到一個編譯或者連結問題都一籌莫展),而編繹器僅僅是C++開發過程中的最後一環而已,你可以不懂,但你總得要花時間去弄懂,因為,作為一個開發者,這是每天都要面對的問題,否則你給別人一個什麼東西,象python一樣,給個原始檔?:)等你搞懂了指標,搞懂了陣列,你還得搞懂指標與陣列之間微妙的關係,等你搞懂了引用,你又不得不搞清引用與指標的區別,等你弄清了static 不同的用法,你又得明白vector<vector<string>> 與vector<vector<string> > 是不一樣的,儘管只是小小一個空格,然後呢?學習STL(不要告訴我你在C++直接不用STL開發應用),實際上STL對於現實應用來說,太差強人意了,如要你常做字元處理,你就明白我說的是什麼了,然後Boost?然後...,終於有一天,你可以開始真正做應用了,一年過去了?:) 另一方面,C++的開發經歷絕對是充滿荊棘和驚喜,以及沮喪,等你達到C/C++的自由王國,你一定是身經百戰,但腦袋中還是有一個弦在緊繃,因為,一不留神,你就又得沒日沒夜的與奇妙的錯誤作戰,這就是C++的開發感受。而且,C/C++的編碼風格問題,一直是開發中充滿爭議的問題,我見過太多的關於風格問題的,毫無意義的爭吵,但是很極少見到最終哪一種風格會令人每個人信服。

       說說python吧,學習過程是這樣的,資料型別是如此面向問題,沒有了令人討論的unsigned , short , long,這種這輩子我都不願弄懂的修飾, 型別連同支援的操作是如此的易懂,一旦你明白了,從Sequence / Mapping緯上看問題,很容易區分list與dict,一旦你明白了Imutable與mutable的意義,你就很容易猜到,tuple與list ,set與frozenset, 的不同方法,一旦明白了list 的inplace-op與string的 non-inplace-op實現,就很容易猜到方法的使用方式,另一方面,符合現實問題的邏輯表示式,通用的len, 簡潔的 a, b = b,a,讓你覺得一切井然有序,而且簡單明晰。強大而廣泛且標準庫,都把問題與實現的距離接近到了可以動手的距離。語法中相當部分約束,減少了不必要語言風格爭論(私下認為,那怕是一個最難看的固定語法都比臨時去決策如何去用來的好),這也加速了開發的步伐,況且還有一個風格標準建議在PEP中。

  現實中,我不相信一個三個月或六個月的應用專案,使用python會比使用C++/C開發出來的系統慢。因為,開發者總是人, 擁有同樣開發年限的C++/C程式設計師與python程式設計師對語言精通的程式是截然不同的,特別情況下,python程式設計師是已經真正進入了經驗積累期,而可能C++/C程式設計師才剛剛有了開發的感覺。如果可以做這樣一個實驗,真實的情況,可能是這樣的,python開發者,早就完成系統測試,著手進行效能的優化,考慮使用C/C++替換部分效能的瓶頸,而C/C++程式可能為整合測試的不完整在正在惴惴不安,訊號是,由於程式設計師的技能問題,專案可能要延期。

附:python與c語言執行效率對比

      Python是個非常流行的解釋型指令碼語言。C是一個非常流行的編譯語言。由於其編譯的性質,導致C一般比Python要快,但是它是更底層的。相對的,Python程式設計更加快速和簡單。譯者注:在目前最權威的TIOBE程式語言排行榜上,Python和C語言分處榜上第6和第2的高位,在指令碼語言和編譯語言中分別坐著第二把交椅(第一把交椅分別是PHP和Java)。     問題在於,Python程式(在沒有輸入的情況下)執行時所額外花費的時間相對C而言是否更加划算,以及執行時所用的時間是否比程式設計時間更加重要。     系統程式     我決定建立一個簡單的程式,該程式可以處理以下公式的計算:     { x + y = 14     { x^2 + y^2 = 100     我很快用Python寫了一遍,找到了答案。然後,我將其翻譯成C語言。我知道,在C語言中的同一程式會花費比Python更多一些的程式碼,但是這並非是我所注意的問題。在繼續之前,讓我們看看程式碼:     Python:     x = 1     while x <= 14:     y = 14 - x     print str(x) + "|" + str(y)     if x**2 + y**2 == 100:     print "match"     x = x + 1     C:     #include (<)stdio.h(>)     int main()     {     int x, y, t;     for (x = 1; x <= 14; x++) {     y = 14 - x;     printf("%d|%d\n", x, y);     if ((x*x) + (y*y) == 100)     printf("match\n");     }     return 0;     }     我總是聽說C語言永遠是最快的語言之一。在命令埠執行這兩個程式,我並沒看出這兩個的執行速度有任何差別。所以我開啟Ubuntu的命令埠,並輸入如下程式碼:     time ./a.out     (time指令,緊跟著可以脫離time指令而單獨執行的普通指令,執行指令並計時——很明顯,這裡的測試物件是C程式。)我得到0.001秒real time(真實用時),而user time(使用者用時)和system time(系統用時)都是0。     接下來是Python:     time python system.py     結果有些嚇人:0.017秒real time,0.012秒user time,0.004秒system time。     當然了,real time的差別畢竟只有16毫秒,不過在長時間執行大量運算的大系統下這個差別就很明顯了。     百萬程式     我決定將這個設想付諸現實。我寫了另一個程式,這個程式將0到1000000之間的所有整數,包括0,依次print輸出。當然這和我之前提到的大量運算的情況還是不同的,不過還是給了計算機比較多一些需要print的內容。     Python:     i = 0     while i (<) 1000000 print i     i = i + 1     C:     #include (<)stdio.h(>)     int main ()     {     int i;     for (i = 0; i <>     printf ("%d\n", i);     return 0;     }     然後是測試結果:     C:     real 0m24.625s     user 0m0.652s     sys 0m2.240s     Python:     real 0m29.805s     user 0m1.984s     sys 0m1.812s 結論     我承認,每個語言都有其優勢和弱點。但從以上結果看來,我只會在像上面這些小程式這樣快捷的程式設計中,或為C程式建立原型的時候才會用Python,而在執行花費時間更重要的任務中,我無疑會選擇C語言。

    譯者:其實這篇文章中用於測試的程式編寫的不是很嚴謹。在原部落格上,這篇文章有不少評論都表示說,雖然他們承認C是比較快,但是這樣的測試方法並沒有充分利用兩種語言的效率最優化機制。不過,具體測試是否準確並非是我所關注的。重點是,一個Java程式設計師,或者一個C程式設計師,或者別的什麼語言的開發人員,在怎樣的情況下,怎樣的職業需求,會促使他們學習並使用新的語言呢?