回答
那麼,取決於你想做什麼。舉例來說,XOR對於有興趣進行數值線性代數的人(由於在下面使用優化的BLAS/LAPACK庫,numpy非常快速)幾乎沒有關係。
通常,從numpy獲得良好性能背後的重要思想是將解釋器的成本分攤到許多元素上。換句話說,將循環從python代碼(慢)移動到numpy/BLAS/LAPACK /等處的C/Fortran循環中。內部(快速)。如果你在這個操作中成功(稱爲向量化),性能通常會很好。
當然,通過轉儲python解釋器和使用C++代替,你顯然可以獲得更好的性能。這種方法是否成功取決於你在C++和numpy的高性能編程方面的優秀程度,以及你想要做什麼操作。
我真的不能說,但我猜想有兩個因素:
也許numpy的是複製更多的東西?當你避免分配大的臨時數組時,編織速度通常更快,但這裏應該沒有關係。
numpy在遍歷(可能)多維數組時使用了一些開銷。這種開銷通常會被數字處理所壓垮,但xor真的非常快,所以真正重要的是開銷。
你有一個像x = a * b + c/d + e
的表達的任何時候,你結束了一個臨時數組爲a * b
,一個臨時數組爲c/d
,一個用於和的一個和結果最後一個分配。這是Python類型和運算符重載的限制。但是,您可以明確地使用擴充的作業(*=
,+=
等)操作員在原地進行操作,並確保不會創建副本。
至於具體原因,NumPy在該基準測試中執行速度較慢,但很難說清楚,但它可能與檢查大小,類型編組等常量開銷有關,Cython /等。不必擔心。在更大的問題上,你可能會看到它更接近。
你的子問題:a = sin(x),有多少往返。
訣竅是將一個numpy數組傳遞給sin(x),然後整個數組只有一個「往返」,因爲numpy將返回一個sin值數組。這個操作沒有涉及到循環的python。
- 1. 爲什麼積分緩慢
- 2. 爲什麼我的UIView行爲緩慢?
- 3. 什麼是熱身緩存?
- 4. Cython:緩慢的numpy陣列
- 5. 爲什麼我的JQuery運行緩慢?
- 6. 爲什麼我的NSURLConnection如此緩慢?
- 7. 這裏使用的是本地緩存嗎?爲什麼這麼慢IEnumerable評價?
- 8. 爲什麼PyPy翻譯如此緩慢?
- 9. 爲什麼emacs緩慢啓動
- 10. 爲什麼Selenium RC如此緩慢?
- 11. 爲什麼NSNotification工作緩慢?
- 12. 爲什麼此查詢運行緩慢?
- 13. 爲什麼MongoDB緩慢插入數據?
- 14. 谷歌chrome隱身的緩慢行爲
- 15. 這是什麼意思,「文件統計」是緩慢的Windows作爲Ruby緩慢的原因?
- 16. 爲什麼是Python的 「排序()」 比慢 「副本,那麼的.sort()」
- 17. 這個numpy數組爲什麼這麼慢?
- 18. 這是爲什麼PHP腳本運行很慢(簡單的SELECT)
- 19. 緩慢加載UITableView。怎麼知道爲什麼?
- 20. 爲什麼我的Project Euler Problem 12的算法如此緩慢?
- 21. 爲什麼ReversedLinesFileReader這麼慢?
- 22. simple_html_dom爲什麼這麼慢?
- 23. 爲什麼shutil.rmtree()這麼慢?
- 24. plyr爲什麼這麼慢?
- 25. numpy.vectorize:爲什麼這麼慢?
- 26. NetworkStream.Read爲什麼這麼慢?
- 27. 爲什麼「htmlspecialchars」這麼慢?
- 28. Android模擬器加載緩慢的原因是什麼?
- 29. Python Numpy - 什麼是numpy.numarray?
- 30. 計算numpy數組中的唯一項:scipy.stats.itemfreq爲什麼這麼慢?
我同意,一旦數據傳遞到fortran端,它是快速的。我更感興趣的是python /編譯後的代碼接口開銷。 說'a = sin(x)'這條線從Python到C的數據經歷了一次往返。我想知道它已經經過了多少層開銷,如果將它移植到cython會更好。 – leon 2010-04-29 21:14:41