[转载] python与c/c++相比有哪些优势
參考鏈接: Python輸入和C++, Java速度對(duì)比
理論上,python的確比C/C++慢(我對(duì)Java的開發(fā)沒有經(jīng)驗(yàn),無(wú)法評(píng)論)。這一點(diǎn)不用質(zhì)疑。 C/C++是編繹語(yǔ)言,直接使用的是機(jī)器指令,而python總是跑在的虛擬機(jī)上, 把一個(gè)邏輯直接轉(zhuǎn)換為機(jī)器指令,和把同樣的邏輯轉(zhuǎn)換為字節(jié)碼,然后再轉(zhuǎn)換為機(jī)器碼來(lái)執(zhí)行相比, 總是要高上一大截,這一點(diǎn),有各種各樣的性能報(bào)告,我沒有必要,也沒有必要去做出這樣一個(gè)報(bào)告來(lái), 我記得大概的數(shù)值是一到兩個(gè)數(shù)量級(jí),用C++的話來(lái)說(shuō),這就是所謂的抽象懲罰。?
但實(shí)踐上,并非這么簡(jiǎn)單。 現(xiàn)實(shí)開發(fā)者領(lǐng)域,總是新手遠(yuǎn)多于高手,而從新手轉(zhuǎn)為高手的時(shí)間相比,C/C++使用者花費(fèi)的時(shí)間要比Python使用者多的多,保守的估計(jì)是5~10倍。?
這有兩方面原因,一方面, C/C++(尤其是C++)的確是“博大精深”,而且總是有無(wú)窮無(wú)盡的細(xì)節(jié),如果你是一個(gè)真正的開發(fā)者,你就會(huì)明白,實(shí)際上,就完全精通C/C++編繹器的選項(xiàng),就足夠?qū)W兩門python了(一點(diǎn)都不夸張,我遇到很多做兩三年的C++開發(fā)者,遇到一個(gè)編譯或者鏈接問題都一籌莫展),而編繹器僅僅是C++開發(fā)過程中的最后一環(huán)而已,你可以不懂,但你總得要花時(shí)間去弄懂,因?yàn)?#xff0c;作為一個(gè)開發(fā)者,這是每天都要面對(duì)的問題,否則你給別人一個(gè)什么東西,像python一樣,給個(gè)源文件?:)等你搞懂了指針,搞懂了數(shù)組,你還得搞懂指針與數(shù)組之間微妙的關(guān)系,等你搞懂了引用,你又不得不搞清引用與指針的區(qū)別,等你弄清了static 不同的用法,你又得明白vector> 與vector > 是不一樣的,盡管只是小小一個(gè)空格,然后呢?學(xué)習(xí)STL(不要告訴我你在C++直接不用STL開發(fā)應(yīng)用),實(shí)際上STL對(duì)于現(xiàn)實(shí)應(yīng)用來(lái)說(shuō),太差強(qiáng)人意了,如要你常做字符處理,你就明白我說(shuō)的是什么了,然后Boost?然后…,終于有一天,你可以開始真正做應(yīng)用了,一年過去了?:) 另一方面,C++的開發(fā)經(jīng)歷絕對(duì)是充滿荊棘和驚喜,以及沮喪,等你達(dá)到C/C++的自由王國(guó),你一定是身經(jīng)百戰(zhàn),但腦袋中還是有一個(gè)弦在緊繃,因?yàn)?#xff0c;一不留神,你就又得沒日沒夜的與奇妙的錯(cuò)誤作戰(zhàn),這就是C++的開發(fā)感受。而且,C/C++的編碼風(fēng)格問題,一直是開發(fā)中充滿爭(zhēng)議的問題,我見過太多的關(guān)于風(fēng)格問題的,毫無(wú)意義的爭(zhēng)吵,但是很極少見到最終哪一種風(fēng)格會(huì)令人每個(gè)人信服。?
申請(qǐng)阿里云服務(wù)時(shí),可以使用2000元阿里云代金券,阿里云官網(wǎng)領(lǐng)取網(wǎng)址:https://dashi.aliyun.com/site/yun/youhui (長(zhǎng)期有效)?
說(shuō)說(shuō)python吧,學(xué)習(xí)過程是這樣的,數(shù)據(jù)類型是如此面向問題,沒有了令人討論的unsigned , short , long,這種這輩子我都不愿弄懂的修飾, 類型連同支持的操作是如此的易懂,一旦你明白了,從Sequence / Mapping緯上看問題,很容易區(qū)分list與dict,一旦你明白了Imutable與mutable的意義,你就很容易猜到,tuple與list ,set與frozenset, 的不同方法,一旦明白了list 的inplace-op與string的 non-inplace-op實(shí)現(xiàn),就很容易猜到方法的使用方式,另一方面,符合現(xiàn)實(shí)問題的邏輯表達(dá)式,通用的len, 簡(jiǎn)潔的 a, b = b,a,讓你覺得一切井然有序,而且簡(jiǎn)單明晰。強(qiáng)大而廣泛且標(biāo)準(zhǔn)庫(kù),都把問題與實(shí)現(xiàn)的距離接近到了可以動(dòng)手的距離。語(yǔ)法中相當(dāng)部分約束,減少了不必要語(yǔ)言風(fēng)格爭(zhēng)論(私下認(rèn)為,那怕是一個(gè)最難看的固定語(yǔ)法都比臨時(shí)去決策如何去用來(lái)的好),這也加速了開發(fā)的步伐,況且還有一個(gè)風(fēng)格標(biāo)準(zhǔn)建議在PEP中。阿里云服務(wù)器1核2G低至89元/年,阿里云官活動(dòng)網(wǎng)址:https://dashi.aliyun.com/site/yun/aliyun?
現(xiàn)實(shí)中,我不相信一個(gè)三個(gè)月或六個(gè)月的應(yīng)用項(xiàng)目,使用python會(huì)比使用C++/C開發(fā)出來(lái)的系統(tǒng)慢。因?yàn)?#xff0c;開發(fā)者總是人, 擁有同樣開發(fā)年限的C++/C程序員與python程序員對(duì)語(yǔ)言精通的程序是截然不同的,特別情況下,python程序員是已經(jīng)真正進(jìn)入了經(jīng)驗(yàn)積累期,而可能C++/C程序員才剛剛有了開發(fā)的感覺。如果可以做這樣一個(gè)實(shí)驗(yàn),真實(shí)的情況,可能是這樣的,python開發(fā)者,早就完成系統(tǒng)測(cè)試,著手進(jìn)行性能的優(yōu)化,考慮使用C/C++替換部分性能的瓶頸,而C/C++程序可能為集成測(cè)試的不完整在正在惴惴不安,信號(hào)是,由于程序員的技能問題,項(xiàng)目可能要延期。?
附:python與c語(yǔ)言運(yùn)行效率對(duì)比?
Python是個(gè)非常流行的解釋型腳本語(yǔ)言。C是一個(gè)非常流行的編譯語(yǔ)言。由于其編譯的性質(zhì),導(dǎo)致C一般比Python要快,但是它是更底層的。相對(duì)的,Python編程更加快速和簡(jiǎn)單。譯者注:在目前最權(quán)威的TIOBE編程語(yǔ)言排行榜上,Python和C語(yǔ)言分處榜上第6和第2的高位,在腳本語(yǔ)言和編譯語(yǔ)言中分別坐著第二把交椅(第一把交椅分別是PHP和Java)。?
問題在于,Python程序(在沒有輸入的情況下)運(yùn)行時(shí)所額外花費(fèi)的時(shí)間相對(duì)C而言是否更加劃算,以及運(yùn)行時(shí)所用的時(shí)間是否比編程時(shí)間更加重要。?
系統(tǒng)程序?
我決定建立一個(gè)簡(jiǎn)單的程序,該程序可以處理以下公式的計(jì)算:?
{ x + y = 14?
{ x^2 + y^2 = 100 我很快用Python寫了一遍,找到了答案。然后,我將其翻譯成C語(yǔ)言。我知道,在C語(yǔ)言中的同一程序會(huì)花費(fèi)比Python更多一些的代碼,但是這并非是我所注意的問題。在繼續(xù)之前,讓我們看看代碼:?
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; } 我總是聽說(shuō)C語(yǔ)言永遠(yuǎn)是最快的語(yǔ)言之一。在命令端口運(yùn)行這兩個(gè)程序,我并沒看出這兩個(gè)的運(yùn)行速度有任何差別。所以我打開Ubuntu的命令端口,并輸入如下代碼:?
time ./a.out (time指令,緊跟著可以脫離time指令而單獨(dú)運(yùn)行的普通指令,運(yùn)行指令并計(jì)時(shí)——很明顯,這里的測(cè)試對(duì)象是C程序。)我得到0.001秒real time(真實(shí)用時(shí)),而user time(用戶用時(shí))和system time(系統(tǒng)用時(shí))都是0。?
接下來(lái)是Python: time python system.py 結(jié)果有些嚇人:0.017秒real time,0.012秒user time,0.004秒system time。?
當(dāng)然了,real time的差別畢竟只有16毫秒,不過在長(zhǎng)時(shí)間運(yùn)行大量運(yùn)算的大系統(tǒng)下這個(gè)差別就很明顯了。?
百萬(wàn)程序 我決定將這個(gè)設(shè)想付諸現(xiàn)實(shí)。我寫了另一個(gè)程序,這個(gè)程序?qū)?到1000000之間的所有整數(shù),包括0,依次print輸出。當(dāng)然這和我之前提到的大量運(yùn)算的情況還是不同的,不過還是給了計(jì)算機(jī)比較多一些需要print的內(nèi)容。?
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è)試結(jié)果:?
C:?
real 0m24.625s user 0m0.652s sys 0m2.240s?
Python:?
real 0m29.805s user 0m1.984s sys 0m1.812s 結(jié)論?
我承認(rèn),每個(gè)語(yǔ)言都有其優(yōu)勢(shì)和弱點(diǎn)。但從以上結(jié)果看來(lái),我只會(huì)在像上面這些小程序這樣快捷的編程中,或?yàn)镃程序建立原型的時(shí)候才會(huì)用Python,而在運(yùn)行花費(fèi)時(shí)間更重要的任務(wù)中,我無(wú)疑會(huì)選擇C語(yǔ)言。
總結(jié)
以上是生活随笔為你收集整理的[转载] python与c/c++相比有哪些优势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标志寄存器_访问标志寄存器,并与寄存器B
- 下一篇: stl vector 函数_vector