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 > 是不一樣的,儘管只是小小一個空格,然後呢?學習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 x2 + y2 == 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|%dn", x, y);
    if ((xx) + (yy) == 100)
    printf("matchn");
    }
    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 ("%dn", 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語言。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章