在Python中创建列表的性能

时间:2018-01-15 13:21:39

标签: python

在Python中创建和填充列表的不同方法的性能开销是什么?

1 个答案:

答案 0 :(得分:3)

以下内容旨在衡量在Python中创建和填充列表的不同方法的开销。在实际程序中,您当然会对添加到列表中的数据执行更有意义的操作。

为了测试这个,我制作了一堆名为test1.pytest2.py等的文件,以不同的方式创建和填充列表。然后我使用timeit模块运行它们:

python -m timeit "from test1 import foo; foo()"

这是在具有2.4 GHz CPU的笔记本电脑上使用Python 3.6.0进行测试的。

结果显示最差:

范围(每个循环237毫秒)

def foo():
    a = list(range(10000000))

有关此问题的评论中提出了一个问题。请注意,这仅适用于填充包含序号的列表。

列表理解(每循环380毫秒)

def foo():
    a = [i for i in range(10000000)]

预分配列表(每个循环492毫秒)

def foo():
    k = 10000000
    a = [0] * k
    for i in range(k):
        a[i] = i

这预先分配整个列表,因此for循环只是填充它而不调用list-append。尽管append-function已经摊销了不变的计算时间,但它并不是完全免费的,因为列表必须在它变满时定期生成,这需要分配新的内存并复制列表的内容。预先分配列表可以避免增加列表的费用。

生成器理解(每循环573毫秒)

def foo():
    a = list((i for i in range(10000000)))

具有良率函数的发电机(每回路580毫秒)

def foo():
    def bar():
        for i in range(10000000):
            yield i

    a = list(bar())

这些时间测量存在一定程度的不确定性,两台发电机的使用时间大致相同。

列表追加(每个循环827毫秒)

def foo():
    a = []
    for i in range(10000000):
        a.append(i)