java、c/c++ 、python 等效能比較 雜談(整理)

來源:互聯網
上載者:User

標籤:cuda   相對   轉換   com   解決方案   名稱   main   挖掘   rgs   

  

連結:https://www.zhihu.com/question/40393531/answer/133242263
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
有人用python寫的代碼如下:
#-*-coding:utf-8-*-import timedef isPrime(i): for test in xrange(2,i): if i % test == 0: return False return Trueif __name__ == ‘__main__‘: t1 = time.clock() n_loops = 50000 n_primes = 0 for i in xrange(0,n_loops): if isPrime(i): n_primes += 1 t2 = time.clock() print str(n_primes) print "run time:%f s" % (t2 -t1)
基於numba加速代碼
#-*-coding:utf-8-*-import timefrom numba import jit@jitdef isPrime(i): for test in xrange(2,i): if i % test == 0: return False return True@jitdef tp(): n_loops = 50000 n_primes = 0 for i in xrange(0,n_loops): if isPrime(i): n_primes += 1 return n_primesif __name__ == ‘__main__‘: t1 = time.clock() n_primes = tp() t2 = time.clock() print str(n_primes) print "run time:%f s" % (t2 -t1)
(這裡插入一些知識:解譯器與編譯器 ,和 Python解譯器)
 

我用python執行時間23秒,用pypy執行時間1.54秒,用numba加速為1.5秒,c語言在本機macos上執行時間1.3秒,java運行速度1.45秒(jre8),詳細見圖片,可見引入jit編譯後,效能直逼c語言,而寫python比寫c容易太多,比java簡潔,寫代碼速度也是非常非常重要。由於曆史原因,很多python庫用的c語言庫,如pandas(pandas的矩陣計算用numpy最佳化過非常快,可能比手寫c語言迴圈還要快),可以通過設計來分離c語言加速後的python代碼和pure python,分別用不同的加速方法,如numba可以單獨加速一個函數,把需要大量計算的放在一個函數用numba加速(numbapro支援顯卡加速但是商業版的)。

所以只適當設計一下,python在一般計算問題下有這些解決方案下效能不是問題,實在不行,你還可以用boost::python來寫個c/c++調用庫來解決效能問題。

下面的測試說明,對於效能,原生python比較慢,在windows下python比linux,macos要快,用pypy後相當於java,c#速度,pypy,c#在windows下受益msvc表現較快,,go語言速度表現比較穩定,c語言理論上是最快,但受環境和編譯器影響較大。對c#,java可能在GC記憶體回收時會表現不穩定,因為在oop中有大量計算後可能要回收垃圾記憶體對象,這個沒有用到oop,只是純計算,理論上還是c/c++語言最快。

python和java比,運行速度比java慢,java強大於改進n次的強大jre,但python在很多領域能調用很多現成的開源庫,在資料分析中有優勢,pyhton的代碼比java要簡潔,容易入門和使用。在最佳化的計算庫協助下,如numpy numba,pandas,scikit-learn,python的實際問題運算效能並不低於java。java主要是架構太多,相對複雜,java主要用於業務程式開發,符合軟體工程理論,延展性強,強型別有利於對程式的靜態檢查分析。java隨著安卓,hadoop,spark的興起,加入java語言的公司很多,效能也可以通過最佳化解決很多問題。很多伺服器如ubuntu server,centos都預設支援python,而java虛擬機器需要安裝配置,python的安裝使用也相對簡單。python的庫有開箱即用感,很多業務領域,你可能還在用oop寫代碼,考慮設計模式,用鋤頭挖溝時,而python調用挖掘機api已經炒菜完工開飯了,缺點是油耗比較大。

Python和c#相比,c#依賴強大的微軟最佳化的.net虛擬機器和強大vs ide,在windows平台下運行速度比java要快,但跨平台運行後如mono,速度就慢了,功能也不完全。c#的跨平台能力比不上python,c#比python要複雜,c#文法和java,c++借簽,比較受編程人員喜好。mono的出現,unity3d用c#調用c++做遊戲商務邏輯,可以在手機上流暢運行,體現了很多程式的效能在於良好的設計,可以把高效能的用c/c++寫,用c#,java,python寫容易變化的商務邏輯部分。c#在mon虛擬機器下運行速度還可以,但linux控在伺服器上有java,python,php,所以用mono做web比較小,從unity3d的成功來看,用c#做為業務指令碼語言,用c++做庫也能擷取很高的效能。這是折中效能和開發速度矛盾的一種解決方案。很多複雜的業務語言用java,c#,在團隊開發時易用性好,也說明了python的工程化比較差,對強型別的支援弱不適合靜態分析,但python一但用強型別申明,那麼是另一種java,也就不是快捷語言。在單純的計算比較,各個虛擬機器語言相差不多,其實除了現代很多業務系統瓶頸在io,在網路,在演算法,在設計,你2秒運行1.2億次,而沒有資料庫或緩衝能做到2秒內記錄完1.2億條資料,都是1秒在1百萬記錄以下,如果走網路速度更慢,持續平均1秒能記錄下幾十萬條資料頂天了,所以這些語言一直在等io完成任務。

python和go語言相比,go語言相對較新,go語言的庫沒有python的豐富,畢竟python發展了幾十年,go語言最大的優點是協程,速度快,支援高並發,但任何支撐高並發的語言編程都不是一件易事,最大的缺點是,名稱有google的go,所有很多其他的巨頭公司本著競爭的觀念對有類似商標的語言有抵制心理。而python是開源,用得公司特別多。go語言的文法如果能像c#,java類似,可能會發展得更好。很多語言為什麼會用它,不在於文法,不在於效能,主要在於這個語言開發了什麼成功的產品,另人會mock這個產品,用這個語言,Docker就是go語言開發的,適就於大規模分發容器。

python語言和c/c++相比,python開發速度比c/c++快,因為c/c++有指標,幹什麼之前,需要考慮好指標的技巧,指標弄不好,會造成記憶體泄露,一點記憶體泄露不要緊,但乘以時間乘數就會耗盡整個記憶體,因記憶體泄露造成的24h*365天伺服器需要重啟會造成實際經濟損失,所以開發商業後台業務程式最好用無指標的java,php,python。但對使用者來說python,java,c#,c/c++開發同樣功能的程式,使用者會選擇c/c++,所以在軟體業無數成功的標牌軟體是c/c++,這是c/c++的成熟之處。c/c++主要是開發成本高,同樣的程式可能python,c#一周,c++搞二個月很正常。但為了利益,花再多時間也有人幹,如同現在一樣有人用彙編寫加密代碼,用FPGA把程式做成晶片,追求的是極致的速度。c/c++的快是直接編譯成二進位,無jit,vm,而python最快也只是調用c的擴充。開發成本也是很高的成本,進階的c++程式很貴,如在美國進階的c++程式員年薪在百萬人民幣以上,有時不是大應用時,用便於使用的語言,上進階點的電腦,上叢集就可以了。如用python顯卡來加速,買個顯卡也就萬元。c/c++適合精雕細琢,走精英路線,python適合快速開發,走福士路線,其實對於影響效能的部分可以結合使用,用python調用c/c++庫。隨著編譯技術進步,電腦的計算力成本會隨時間下降,計算力越來越強,最近的cpu多核主頻高達5g,理論上比2.5g的cpu算力快一倍,用液氮超頻可達6.7g,同樣的核也比我電腦快了1.5倍(如果用進階c++語言程式員最佳化了1倍時間花費1人/年,顯然超過了換電腦的錢),顯卡在多核的支援下浮點運算能力也越來越高(可用NumbaPro,PyCUDA), HPC在雲市場可以租用到,超級電腦也可以向有關組織租用機時測試,動態語言以其易用性開發成本低在很多領域可以取代高效能的編譯語言,但極致的編譯效能軟體市場也是不斷擴大的,很多行業算力跟不上,很多np-hard問題對算力需求不是線性增加能滿足的,人們對效能的需要實際是越來越高,如世界競爭的超級電腦,比特幣礦機,深度學習演算法。誰都不可以取代誰,而是大家都結合發展了。用什麼語言沒有好壞之分,關鍵是在目標程式追求的是什麼。
連結:https://www.zhihu.com/question/40393531/answer/133242263
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

實際上我心中覺得最好的x語言是
java的跨平台+c#的ide和文法+python的庫+c++語言的效能+go語言的協程

python在macos執行時間23.3秒,pypy在macos執行時間1.54秒,python在ubuntu下測試為13.5秒,pypy在ubuntu下測試為2.3秒。

用numba加速在macos結果為1.5秒。
python在windows7下已耗用時間為7.4秒,pypy在windows7下的已耗用時間為0.6秒。

用不同python編譯器在win7下啟動並執行結果,pypy為0.56秒,jython為4.7秒,IronPython為5.2秒,python為6.5秒

c語言在macos運行結果1.34秒(LLVM)
c語言(vc++13)在windows7下的已耗用時間為0.34秒,為什麼會這麼快,可能和msvc的編譯器對windows平台數字計算最佳化有關。包括上面的windows下的python,用msv編譯版後速度較macos要快。c語言我在ubuntu下用打-O2最佳化,用gcc是2秒,用clang是1.88秒。
c語言開啟-O2二級最佳化,用llvm和gcc,速度差不多都在1.2秒,clang要快點

java在macos運行結果1.4秒,我在ubuntu上測試為2秒。

java在windows7下的執行時間為1.23秒
go語言測試代碼如下:
package mainimport ("fmt""time")func main() { n_loops := 50000 n_primes := 0 t1 := time.Now() // get current time for i := 0;i < n_loops;i++ { if isPrime(i) { n_primes++}} t2 := time.Since(t1) fmt.Println("Time taken=", t2) fmt.Println("primes found",n_primes);} func isPrime(i int)(bool){ for test := 2; test < i; test++{ if i % test == 0 { return false } } return true}
go語言在macos測試結果1.1秒,我在ubuntu下測試為0.91秒

go語言在windows 7平台下1.18秒,你還可以用Grumpy,把python先轉換成go語言,再編譯go語言成二進位實現加速。

c#基於mono在macos執行時間2.84秒,在ubuntu上測試為1.8秒。

c#基於windows7執行時間1.17秒

c#代碼如下:
using System;namespace TestPrime{class MainClass{private static long LoopCount=0L;private static bool isPrime(long i){for (long test = 2; test < i; test++){if (i % test == 0){return false;}LoopCount++;}return true;}public static void Main(string[] args){TimeSpan start_time = DateTime.Now.TimeOfDay;long n_loops = 50000;long n_primes = 0;for (long i = 0; i < n_loops; i++){if (isPrime(i)){n_primes++;}}TimeSpan end_time = DateTime.Now.TimeOfDay - start_time;Console.WriteLine(n_primes + " primes found");Console.WriteLine("Time taken = " + end_time.TotalSeconds);Console.WriteLine("LoopCount = " + LoopCount);}}}

java、c/c++ 、python 等效能比較 雜談(整理)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.