python中的高效数组操作

时间:2017-01-31 09:00:03

标签: python arrays

我正在尝试在python中创建一个相当大的数组,其中包含0和1。最后它应该有大约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会更好吗?或者如果迭代它需要相同的时间,那会不会有帮助吗?

我愿意接受任何建议。

2 个答案:

答案 0 :(得分:1)

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

EO.Pdf.HtmlToPdf.Options.HeaderHtmlFormat = '<div class="print-banner">
        <span class="banner-text-repeat">Some Text</span>
    </div>'

通过

    for i in range(0, slot_duration):
        for j in range(0, 400):
            transmission_array.append(1)

你执行1条指令,经过C编译,你可以在1步中扩展你的列表,而不需要调整大小。就像这样,你可以避免双循环,并在引擎盖下执行更少的调整大小/内存副本。

如果transmission_array.extend([1]*400*slot_duration) 不变,您可以声明:

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)

答案 1 :(得分:1)

我建议使用以下更多的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

由于您只在数组中存储零和一,我建议使用sparse array。它的内存消耗更少。