2010-04-28 67 views

回答

12

那麼,取決於你想做什麼。舉例來說,XOR對於有興趣進行數值線性代數的人(由於在下面使用優化的BLAS/LAPACK庫,numpy非常快速)幾乎沒有關係。

通常,從numpy獲得良好性能背後的重要思想是將解釋器的成本分攤到許多元素上。換句話說,將循環從python代碼(慢)移動到numpy/BLAS/LAPACK /等處的C/Fortran循環中。內部(快速)。如果你在這個操作中成功(稱爲向量化),性能通常會很好。

當然,通過轉儲python解釋器和使用C++代替,你顯然可以獲得更好的性能。這種方法是否成功取決於你在C++和numpy的高性能編程方面的優秀程度,以及你想要做什麼操作。

+0

我同意,一旦數據傳遞到fortran端,它是快速的。我更感興趣的是python /編譯後的代碼接口開銷。 說'a = sin(x)'這條線從Python到C的數據經歷了一次往返。我想知道它已經經過了多少層開銷,如果將它移植到cython會更好。 – leon 2010-04-29 21:14:41

0

我真的不能說,但我猜想有兩個因素:

  1. 也許numpy的是複製更多的東西?當你避免分配大的臨時數組時,編織速度通常更快,但這裏應該沒有關係。

  2. numpy在遍歷(可能)多維數組時使用了一些開銷。這種開銷通常會被數字處理所壓垮,但xor真的非常快,所以真正重要的是開銷。

1

你有一個像x = a * b + c/d + e的表達的任何時候,你結束了一個臨時數組爲a * b,一個臨時數組爲c/d,一個用於和的一個和結果最後一個分配。這是Python類型和運算符重載的限制。但是,您可以明確地使用擴充的作業(*=,+=等)操作員在原地進行操作,並確保不會創建副本。

至於具體原因,NumPy在該基準測試中執行速度較慢,但​​很難說清楚,但它可能與檢查大小,類型編組等常量開銷有關,Cython /等。不必擔心。在更大的問題上,你可能會看到它更接近。

0

你的子問題:a = sin(x),有多少往返。

訣竅是將一個numpy數組傳遞給sin(x),然後整個數組只有一個「往返」,因爲numpy將返回一個sin值數組。這個操作沒有涉及到循環的python。