我正在使用numpy.random.shuffle
來計算二維數組隨機列的統計量。 Python的代碼如下:numpy.random.shuffle有更快的版本嗎?
import numpy as np
def timeline_sample(series, num):
random = series.copy()
for i in range(num):
np.random.shuffle(random.T)
yield random
我得到的速度是這樣的:
import numpy as np
arr = np.random.sample((50, 5000))
%%timeit
for series in timeline_sample(rnd, 100):
np.sum(series)
1 loops, best of 3: 391 ms per loop
我試圖Cythonize這個功能,但我不知道如何取代np.random.shuffle
和func的呼叫重刑慢了3倍。有誰知道如何加速或取代這個?這是目前我的計劃中的瓶頸。
用Cython代碼:
cimport cython
import numpy as np
cimport numpy as np
@cython.boundscheck(False)
@cython.wraparound(False)
def timeline_sample2(double[:, ::1] series, int num):
cdef double[:, ::1] random = series.copy()
cdef int i
for i in range(num):
np.random.shuffle(random.T)
yield random
我大概計算導致大約600 MB/s的吞吐量,考慮到您對數據進行多次通過,並且*每個timeline_sample調用產生大約3M個隨機整數,這並不算太壞。 OTOH你的數據集是70 KiB,它應該適合二級緩存,其中內存帶寬應該明顯更大。我不確定是否可以顯着提高性能。 – delnan 2014-11-08 15:12:12
謝謝你的球場號碼。我的真實代碼寧可是一個尺寸爲40 x 5000的數組,是否會對您的估計產生顯着影響? – Midnighter 2014-11-08 15:29:51