Ci sono almeno due modi per invertire una lista in Python, ma l'approccio iteratore è molto più veloce (almeno in Python 2.7.x). Voglio capire cosa contribuisce a questa differenza di velocità.Perché è invertire una lista con slicing più lento di iteratore inverso
>>> x = range(1000)
>>> %timeit x[::-1]
100000 loops, best of 3: 2.99 us per loop
>>> %timeit reversed(x)
10000000 loops, best of 3: 169 ns per loop
ho il sospetto la differenza di velocità è dovuta almeno i seguenti:
reversed
è scritto in Creversed
è un iteratore, quindi meno overhead di memoria
I ho provato ad usare il modulo dis
per avere una visione migliore di queste operazioni, ma non è stato di grande aiuto. Ho dovuto mettere queste operazioni in una funzione per smontarle.
>> def reverselist(_list):
... return _list[::-1]
...
>>> dis.dis(reverselist)
2 0 LOAD_FAST 0 (_list)
3 LOAD_CONST 0 (None)
6 LOAD_CONST 0 (None)
9 LOAD_CONST 1 (-1)
12 BUILD_SLICE 3
15 BINARY_SUBSCR
16 RETURN_VALUE
>>> def reversed_iter(_list):
... return reversed(_list)
...
>>> dis.dis(reversed_iter)
2 0 LOAD_GLOBAL 0 (reversed)
3 LOAD_FAST 0 (_list)
6 CALL_FUNCTION 1
9 RETURN_VALUE
Che cosa tutto accade esattamente durante un'operazione di affettamento, c'è un sacco di overhead di memoria? Forse slicing è implementato in puro Python?
Come nota a margine, non ho dovuto mettere queste operazioni in un metodo per utilizzare il modulo 'dis'. [Questo post] (http://stackoverflow.com/questions/13270888/why-is-startswith-slower-than-slicing) ha un piccolo 'lambda' piuttosto che compila la stringa di codice prima (richiesto) quindi lo passa a' dis.dis'. –