为什么"lst.reverse()"比"lst [:: - 1]"快得多?

Dev*_*ump 0 python

为什么lst.reverse()这么快lst[::-1]?Python 3和2似乎都有很大的时差.

示例(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
Run Code Online (Sandbox Code Playgroud)

Mos*_*oye 14

开玩笑.

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
Run Code Online (Sandbox Code Playgroud)

几乎相同的时序,reverse在这种情况下由于方法调用的额外开销而丢失,与使用语言构造的第一种情况相反.