為什麼蘋果新語言 Swift 的 RC4 運算效能是 Python 的 220 倍?
Swift 是解釋型語言吧,真能做到那麼快嗎,或者210倍只是特殊的某些功能上的速度對比,四則運算應該提升不了這麼多吧?
與提問者的直覺相反,四則運算恰恰是Python(相對於C)最慢的部分。一個整數a+b在Python VM里要經過大約上百行的C代碼,其中包括bytecode解釋,動態類型帶來的間接調用,對bigint的無縫支持等等。要在四則運算上比Python快上百倍,只需要性能不比C差出數量級就可以。這也是各種JIT最喜歡拿四則運算作演示的原因。
而實際的UI代碼中,用戶邏輯使用的語言,性能其實無關緊要。因為大部分用戶邏輯無非是「當用戶操作A發生時改變UI元素BCD的狀態」、「從伺服器返回結果中提取欄位XYZ並設置到對應的UI元素」等等,膠水代碼而已。平均每執行一行用戶代碼,框架代碼要執行幾百行,這隻要在debugger中step into框架代碼就能了解。因此只要框架用高效的語言實現,用戶代碼即使用慢上百倍的Python也無所謂。洗洗睡吧,當然是特定環境下的特定跑分。pypy 跑斐波那契數列就比 cpython 快到不知道哪裡去了,線上有幾家在用?
Swift 既然是編譯到機器碼運行的,那就不該和跑在官方解釋器上的 Python 比較。
Python 也能編譯,用的也是 LLVM。Swift 和這樣的 Python 比較才有意義。
就題主關心的四則運算來說,舉加法的例子,用了 Numba 的 Python 比 C 都快。
Benchmark這個東西,如果沒有公布:
1.實際的測試用例
2.各種語言的具體實現
swift編譯出來的是機器碼,python(應該是CPython)編譯出來的是python虛擬機運行的位元組碼。
那麼在絕大多數場景下,運行效率肯定是存在巨大差異的。但我覺得210倍這個值是在某個特定的特別能顯得swift快的場景下的結論。
其實swift和python的可比性沒有那麼大,應該和golang比才是真的大丈夫實測,Python和Swift的運算速度是有200多倍的差距(參見下圖)。解釋型的優勢,是編程時運行和調試更快,效率更高。編寫好的程序實際運行時,大部分時間在等候,或者執行系統代碼,性能差距就沒有這麼懸殊了。在未遇到性能瓶頸的場景中,解釋型更方便快捷。因此,全球大部分網站選用速度較慢的PHP,在遇到瓶頸後可能會用C++或Java等來優化後台。
這有什麼奇怪?!主流編程系統中找比CPython慢的一直都很難
你好意思拿個編譯語言跟腳本語言比么?
圖片中的英文,意思是「RC4加密」,這是一種密碼級的偽隨機數生成演算法,主要性能開銷,還真就是四則運算。
由此可見,Python的四則運算有多麼糟糕。忽悠果粉無所不用其極啊
是編譯型語言,和 Objective-C 使用同一個運行時,效率接近 C,可是你不能拿來欺負 Python 啊一直沒有好好對比過不同語言的Benchmark。不過我自己做個實現橫向對比三種Python實現,對比的基礎是Python自帶的測試腳本,pystone.py。原作者是大神Guido van Rossum,從C語言移植。測試下來:
CPython為基準,pypy是CPython的8倍,Jython最慢,是CPython的0.5倍。
不知道這個程序是否有對應其他語言版本,省得移植了。衡量語言的優勢或劣勢需要多方面衡量。接下來我計劃重現libuv/pyuv,據pyuv作者說,可以實現與Golang一樣的性能。
Integrating Twisted and Tornado with pyuv
對我開發的物聯網應用來說,實現性能很重要。計算任務可以分為I/O密集型、CPU密集型和MEM密集型,雲計算入網不限流量、所以只需要對CPU和MEM佔比測試一下。因為CPython太慢,Twisted server 因為CPU佔比太高而被OS殺掉,MEM佔比當時只佔很少比例。所以基於pypy提升CPU佔比表現,再加上pyuv實現更快的非同步底層,之後的表現讓我期待。Swift是編譯的靜態類型語言吧……跟Go和Rust比才公平吧。
那當然不,比完被吊打有啥公平的。
不是解釋型語言,還是編譯型的動態語言,高效率是編譯器(Clang.LLVM)的優化,核心的東西還是原有的那套。
是可能的,推薦你了解下LLVM這個東西,應該是先編譯為一種中間表達,但是隨後進一步編譯為純機器碼。本質上跟C和ObjC編譯出來的沒區別,都是彙編機器碼,所以效率問題可以忘掉了。
而當你需要即時出結果,就像解釋型腳本語言那樣時,切換兩遍編譯為一遍,改輸出機器碼為輸出中間表示給解釋器即可。LLVM真的是革命性的東西
python是動態語言, 和python比,也就那點出息...
不可能吧,以前OJ上試過同一個演算法,用C寫也就一般保持在比Python快50倍而已
真要說速度的話,蘋果敢用 python Crypto.Cipher.ARC4 來嗎
推薦閱讀: