適應它SMP您可以只用做您最初描述的內容(生成一串隨機數和乘以相應劃分)加快東西從什麼mtrw上面貼了一下......
另外,您可能已經知道這一點,但在處理大型numpy數組時,一定要在原地進行操作(* =,/ =,+ =等)。它對大型陣列的內存使用量產生了巨大的影響,並且也會顯着提高速度。
In [53]: def rand_row_doubles(row_limits, num):
....: ncols = len(row_limits)
....: x = np.random.random((num, ncols))
....: x *= row_limits
....: return x
....:
In [59]: %timeit rand_row_doubles(np.arange(7) + 1, 1000000)
10 loops, best of 3: 187 ms per loop
相比於:
In [66]: %timeit ManyRandDoubles(np.arange(7) + 1, 1000000)
1 loops, best of 3: 222 ms per loop
這不是一個巨大的差異,但如果你真的擔心速度,它的東西。
只是爲了表明它是正確的:
In [68]: x.max(0)
Out[68]:
array([ 0.99999991, 1.99999971, 2.99999737, 3.99999569, 4.99999836,
5.99999114, 6.99999738])
In [69]: x.min(0)
Out[69]:
array([ 4.02099599e-07, 4.41729377e-07, 4.33480302e-08,
7.43497138e-06, 1.28446819e-05, 4.27614385e-07,
1.34106753e-05])
同樣,你的「行總和爲1」的一部分......
In [70]: def rand_rows_sum_to_one(nrows, ncols):
....: x = np.random.random((ncols, nrows))
....: y = x.sum(axis=0)
....: x /= y
....: return x.T
....:
In [71]: %timeit rand_rows_sum_to_one(1000000, 13)
1 loops, best of 3: 455 ms per loop
In [72]: x = rand_rows_sum_to_one(1000000, 13)
In [73]: x.sum(axis=1)
Out[73]: array([ 1., 1., 1., ..., 1., 1., 1.])
老實說,即使你重新實現用C事,我不確定你會在這一場比賽中大大地擊敗numpy ......不過我可能是錯的!
這幾乎是一個保證,去磁盤I/O不會讓它更快,所以文件存儲方法可能不是你想要的。 – 2010-04-25 20:25:55
數字的範圍是什麼?我認爲他們是浮點? 你要走多快?你需要多少隨機性?你能通過生成N/7數字並旋轉它們嗎?m – Anycorn 2010-04-25 20:26:45
這些數字在需要時隨機生成有多重要?這可能是一個選擇,可能存儲5倍以前生成的隨機數,並選擇一組隨機數? – poke 2010-04-25 20:28:05