python - python中高效的数组操作

标签 python arrays

我正在尝试在 python 中创建一个相当大的数组,其中填充了 0 和 1。最后它应该有大约 12 亿个条目。我确实像示例中那样填写它。背后的想法是,400 个条目是一个时隙,对于每个时隙,它是一个的概率为 p。如果是这种情况,它会为 slot_duration 时隙填充 1,否则它会填充 400 个条目,一个时隙,0。

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 秒。

我的问题是,是否有更高效的方法来做到这一点?初始化一个包含零的固定长度的数组然后将值重新分配给一个会更好吗?或者,如果迭代它需要相同的时间,那不会有帮助吗?

我愿意接受任何建议。

最佳答案

如果你有足够的内存,你可以替换那个循环:

    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 语言编译,并一次性扩展您的列表,而无需调整所有大小。像这样,您避免了双循环并在幕后执行更少的调整大小/内存复制。

如果 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

关于python - python中高效的数组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41953362/

相关文章:

Python/Pandas - 按标准分组的最佳方式?

python - 如何在 matplotlib 图上的鼠标单击之间绘制线条?

python - 如何解决 'module' 对象没有属性 '_base' 问题?

python - numpy 选择不同长度的每一行

C程序-如何检查数组元素

objective-c - 将键的值插入 NSMutableArray

java - 使用数组添加多个类型,多次

python - Pandas Dataframe 中的对 boolean 值进行分组

c# - 将资源文本文件读入数组

python - 如何使用 numpy 加载没有固定列大小的数据