在Python中创建和填充列表的不同方法的性能开销是什么?
答案 0 :(得分:3)
以下内容旨在衡量在Python中创建和填充列表的不同方法的开销。在实际程序中,您当然会对添加到列表中的数据执行更有意义的操作。
为了测试这个,我制作了一堆名为test1.py
,test2.py
等的文件,以不同的方式创建和填充列表。然后我使用timeit
模块运行它们:
python -m timeit "from test1 import foo; foo()"
这是在具有2.4 GHz CPU的笔记本电脑上使用Python 3.6.0进行测试的。
结果显示最差:
def foo():
a = list(range(10000000))
有关此问题的评论中提出了一个问题。请注意,这仅适用于填充包含序号的列表。
def foo():
a = [i for i in range(10000000)]
def foo():
k = 10000000
a = [0] * k
for i in range(k):
a[i] = i
这预先分配整个列表,因此for循环只是填充它而不调用list-append。尽管append-function已经摊销了不变的计算时间,但它并不是完全免费的,因为列表必须在它变满时定期生成,这需要分配新的内存并复制列表的内容。预先分配列表可以避免增加列表的费用。
def foo():
a = list((i for i in range(10000000)))
def foo():
def bar():
for i in range(10000000):
yield i
a = list(bar())
这些时间测量存在一定程度的不确定性,两台发电机的使用时间大致相同。
def foo():
a = []
for i in range(10000000):
a.append(i)