2016-11-15 160 views
0

为什么lst.reverse()lst[::-1]快得多?似乎有在两者的Python 3和2为什么“lst.reverse()”比“lst [:: - 1]”快得多?

实施例大的时间差(Python的3.5)隔开

>>> from timeit import timeit 
>>> lst = list('Crooked Hillary!') * 1000 
>>> def TrumpWins(lst): 
... lst.reverse() 
... return lst 
... 
>>> def SecondPlace(lst): 
... return lst[::-1] 
... 
>>> timeit(lambda: TrumpWins(lst), number=100000) 
0.7976173080969602 
>>> timeit(lambda: SecondPlace(lst), number=100000) 
4.703373569995165 
+5

你刚刚发布这个是为了让它惊人吗? – deceze

+1

我会说'reverse'使用编译过的'for',但是'lst [:: - 1]'调用了一个未编译好的'...',但我可能完全错误。顺便说一句,你很可能被这样的帐户名称禁止。 –

+3

没有赢得这里的热门投票 – EdChum

回答

13

笑话。

lst[::-1]返回一个新列表,而list.reverse只是执行列表的逆转。额外的开销来自创建一个新列表。而成本/开销将与您试图扭转的列表长度成比例增长。

一个更公平的比较,可能会调用reverse方法之前列表复制:

In [14]: l = [1]*1000 

In [15]: %%timeit 
    ....: l[::-1] 
    ....: 
100000 loops, best of 3: 5.64 µs per loop 

In [16]: %%timeit 
    ....: l[:].reverse() 
    ....: 
100000 loops, best of 3: 6.27 µs per loop 

约合时序,与reverse在这种情况下输给了由于方法调用的额外开销,作为对第一种情况是使用语言结构。

相关问题