回答
那麼,取決於你想做什麼。舉例來說,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. 什麼是熱身緩存?
- 3. 爲什麼我的UIView行爲緩慢?
- 4. 爲什麼numpy的einsum比numpy的內置函數慢?
- 5. Cython:緩慢的numpy陣列
- 6. 爲什麼我的MySQL加入緩慢?
- 7. 爲什麼我的NSURLConnection如此緩慢?
- 8. 爲什麼我的JQuery運行緩慢?
- 9. 這裏使用的是本地緩存嗎?爲什麼這麼慢IEnumerable評價?
- 10. 爲什麼java.awt.Graphics.drawLine異常緩慢?
- 11. 爲什麼Symfony3重定向緩慢
- 12. 爲什麼硒測試如此緩慢?
- 13. 爲什麼在vb.net server.transfer進程緩慢?
- 14. 爲什麼emacs緩慢啓動
- 15. 爲什麼Tk畫布如此緩慢?
- 16. 爲什麼Selenium RC如此緩慢?
- 17. 爲什麼PyPy翻譯如此緩慢?
- 18. 爲什麼在JavaScript中輸入緩慢?
- 19. Pygame程序運行緩慢。爲什麼?
- 20. 爲什麼後效果如此緩慢?
- 21. OpenCL緩慢 - 不確定爲什麼
- 22. 爲什麼線程緩慢啓動?
- 23. 爲什麼此查詢運行緩慢?
- 24. 爲什麼NSNotification工作緩慢?
- 25. 谷歌chrome隱身的緩慢行爲
- 26. 爲什麼clojure中的java本地HashMap運行緩慢?
- 27. 這是什麼意思,「文件統計」是緩慢的Windows作爲Ruby緩慢的原因?
- 28. 爲什麼Java本地緩衝區速度很慢?
- 29. 爲什麼是Python的 「排序()」 比慢 「副本,那麼的.sort()」
- 30. 這個numpy數組爲什麼這麼慢?
我同意,一旦數據傳遞到fortran端,它是快速的。我更感興趣的是python /編譯後的代碼接口開銷。 說'a = sin(x)'這條線從Python到C的數據經歷了一次往返。我想知道它已經經過了多少層開銷,如果將它移植到cython會更好。 – leon 2010-04-29 21:14:41