[英]Efficient parallelization of operations on two dimensional array operations in python
[英]Efficient array operations in python
我試圖在python中創建一個相當大的數組,填充零和一個。 最后它應該有大約12億條目。 我在示例中填寫它。 背后的想法是400個條目是一個時隙,並且對於每個時隙,存在概率p,它是1。 如果是這種情況,則為slot_duration時隙填充一個,否則填充400個條目,一個時隙,零。
import numpy as np
p = 0.01
slot_duration = 10
test_duration = 60
timeslots_left = test_duration * 1000 * 1000 / 20
transmission_array = []
while timeslots_left >= 0:
rand_num = np.random.choice((0, 1), p=[1 - p, p])
if rand_num == 1:
for i in range(0, slot_duration):
for j in range(0, 400):
transmission_array.append(1)
timeslots_left -= slot_duration
else:
for j in range(0, 400):
transmission_array.append(0)
timeslots_left -= 1
表演當然很糟糕。 持續時間為10,生成數組大約需要45秒,但迭代它也需要45秒。
我的問題是,是否有更高效的方法來做到這一點? 初始化一個包含零的固定長度的數組,然后將值重新賦值為1會更好嗎? 或者,如果迭代它需要相同的時間,這會無濟於事嗎?
我願意接受任何建議。
如果你有足夠的內存,你可以替換該循環:
for i in range(0, slot_duration):
for j in range(0, 400):
transmission_array.append(1)
通過
transmission_array.extend([1]*400*slot_duration)
你執行1條指令,C編譯,並且你在1 go中擴展你的列表,而不是所有的大小調整。 像這樣你就可以避免雙循環並且在引擎蓋下執行更少的調整大小/內存副本。
如果slot_duration
是常量,您可以聲明:
chunk = [1]*400*slot_duration
在啟動時你可以做transmission_array.extend(chunk)
所以你要避免在每次迭代時分配chunk
同樣的問題,同樣的解決方法:
for j in range(0, 400):
transmission_array.append(0)
變
transmission_array.extend(zero_array)
使用zero_array = [0]*400
我會建議以下更多的pythonic代碼。
最好避免執行循環以便只將新值附加到列表中。
p = 0.01
slot_duration = 10
test_duration = 60
timeslots_left = test_duration * 1000 * 1000 / 20
transmission_array = []
while timeslots_left >= 0:
rand_num = np.random.choice((0, 1), p=[1 - p, p])
duration = slot_duration if rand_num == 1 else 1
transmission_array.extend([rand_num] * 400 * duration)
timeslots_left -= duration
由於您只在數組中存儲零和一,我建議使用稀疏數組 。 它的內存消耗更少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.