In Python 3.x,
range(0,3)
restituisce una classe di oggetti iterabili immutabili che consente di eseguire iterazioni su di loro, non produce gli elenchi, e non conservare tutti gli elementi della gamma in memoria, invece producono gli elementi al volo (mentre li stai iterando), mentre list(range(0,3))
produce un elenco (iterando su tutti gli elementi e aggiungendo l'elenco internamente).
Esempio -
>>> range(0,3)
range(0, 3)
>>> list(range(0,3))
[0, 1, 2]
Idealmente, se si desidera solo iterare su tale intervallo di valori, range(0,3)
sarebbe più veloce di (list(range(0,3))
perché quest'ultimo ha l'overhead di produrre un elenco prima di iniziare l'iterazione su di esso.
In Python 2.x, range(0,3)
produce un elenco, invece abbiamo avuto anche una funzione xrange()
che ha un comportamento simile range()
funzione da Python 3.x (xrange stato rinominato variare in Python 3.x)
per Python 3.5, Dalle documentation -
oggetti Range attuare il collections.abc.Sequence ABC, e fornire caratteristiche come test di contenimento, ricerca di indice, affettamento e il supporto per gli indici negativi
Così si può fare le cose come -
>>> range(0,10)[5]
5
>>> range(0,10)[3:7]
range(3, 7)
>>> 5 in range(6,10)
False
>>> 7 in range(1,8)
True
E tutto si tratta di operazioni a tempo costante, come si può vedere da questa prova -
In [11]: %timeit a = xrange(0,1000000)[1000]
1000000 loops, best of 3: 342 ns per loop
In [12]: %timeit a = xrange(0,1000000)[10000]
1000000 loops, best of 3: 342 ns per loop
In [13]: %timeit a = xrange(0,1000000)[100000]
1000000 loops, best of 3: 342 ns per loop
In [14]: %timeit a = xrange(0,1000000)[999999]
1000000 loops, best of 3: 342 ns per loop
In [15]: %timeit a = xrange(0,10000000)[9999999]
1000000 loops, best of 3: 339 ns per loop
In [16]: %timeit a = xrange(0,1000000000000)[9999999999]
1000000 loops, best of 3: 341 ns per loop
Quindi in Python 3 è 'range (x, y)' qualcosa di simile a un generatore? Solo qualcosa che mi stavo chiedendo da quando ho visto questo comportamento ... – Kyrubas
Intenzionale per ora, perché l'interprete online che ho usato per ottenere l'esempio timeit è Python 2.7, quindi ho usato xrange invece di range. Ma non dovrebbe avere importanza perché il range di Python 3 è Python 2.x's xrange() –
Ok ho pensato che fosse qualcosa del genere. Volevo solo assicurarmi che fosse intenzionale. – Scott