我试图在
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)
所以你要避免在每次迭代时分配块
同样的问题,同样的解决方法:
for j in range(0, 400):
transmission_array.append(0)
变
transmission_array.extend(zero_array)
使用zero_array = [0] * 400