簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM