2015-11-03 58 views
1

代碼在內存中分配大的陣列與Python

import array, itertools 
a = array.array('B', itertools.repeat(0, 3715948544)) 

需要近7分鐘,以我的機器(6m44s)上運行。該計算機具有8 Gb的RAM,並使用CPython 3.4.3運行Linux。如何更快地獲得1字節無符號整型數據的類似數組的對象,最好使用Python標準庫? Numpy可以立即分配(小於1毫秒)。

+1

你爲什麼預先分配它? –

+0

你應該放棄標準庫並使用[numpy](http://www.numpy.org/)代替 –

+3

等待,如果你知道* NumPy可以解決你的問題,你爲什麼會問這個問題? – user2357112

回答

2

如果你真的不能使用NumPy的,你可以嘗試多遠,你可以用獲得的內置bytearray

a = bytearray(3715948544) 

這應該在幾秒鐘最多完成。

+0

這與從不同答案(大約1.95秒)的序列乘法一樣快。謝謝! – Pastafarianist

+0

@Pastafarianist它仍然有與序列相乘的問題 - 在創建它之後,如果事情變得非常緩慢,您無法真正對巨型緩衝區進行任何有用的操作。 –

+0

我剛剛測試過'bytearray' vs'array.array' vs'numpy'。在我的特殊情況下,'bytearray'是最快的,'array.array'是緊隨其後的,'numpy'的損失接近2倍。我正在運行一個特定的計算,這個數組基本上是一個巨大的計數器:I讀取值,添加+1,將其寫回並檢查它是否超出閾值。使用'bytearray'我得到約7.5秒/迭代,'array.array'約爲7.75秒,'numpy'爲14.6秒。 – Pastafarianist

5
a = array.array('B', [0]) * 3715948544 

序列乘法,類似於如何創建一個巨大的零列表。請注意,任何你想要與這個巨型陣列可能會像你最初的嘗試創建它。

+0

這需要我的電腦2秒鐘左右。謝謝! – Pastafarianist

1

起初我還以爲numpy將是最快的,但由斯文指出,bytearray是相當快的10000嘗試在30億與bytearray你的運氣了。

In [1]: import numpy as np 

In [2]: import array, itertools 

In [3]: %timeit array.array('B', itertools.repeat(0, 10000)) 
1000 loops, best of 3: 456 µs per loop 

In [4]: %timeit np.zeros(10000, dtype='uint8') 
1000000 loops, best of 3: 924 ns per loop 

In [5]: %timeit bytearray(10000) 
1000000 loops, best of 3: 328 ns per loop 
+2

Numpy當然是最好的解決方案,因爲它是唯一的解決方案,它可以讓你在創建數組後做實際的事情。 –