【发布时间】:2012-09-14 07:12:39
【问题描述】:
灵感来自this nice answer,
这是一个基准:
import timeit
def test1():
a = [1,2,3]
a.insert(0,1)
def test2():
a = [1,2,3]
a[0:0]=[1]
print (timeit.timeit('test1()','from __main__ import test1'))
print (timeit.timeit('test2()','from __main__ import test2'))
对我来说,test2 稍微快一些(~10%)。为什么会这样?我希望它会更慢,因为:
- 切片分配必须能够接受任何长度的迭代,因此必须更通用。
- 在切片分配中,我们需要在右侧创建一个新列表才能使其正常工作。
谁能帮我理解这个?
(在 OS-X 10.5.8 上使用 python 2.7)
【问题讨论】:
-
好问题 :) 我自己对此很好奇。
-
@TimPietzcker -- 你的基准测试真的让我陷入了困境。我必须自己测试它:)。
-
我猜
insert是通过调用切片分配代码来实现的。 -
@KeithRandall:不,两个代码路径是分开的(
list_ass_slice与hg.python.org/cpython/file/bfdf366a779a/Objects/listobject.c 中的ins1)。 -
@JoranBeasley -- 在我的基准测试中,列表没有增长。但是在 Tim Pietzcker 的(见链接的答案)中,它在基准测试的同时增长。 (我认为最长可达 100000 左右)
标签: python performance optimization python-internals