Kilka informacji o tym konkretnym przykładzie: Jeśli chcesz tylko do iteracji, map lub filtrować wyniki, można użyć generatora, aby uniknąć kopię tablicy:
import itertools
files = itertools.islice(files, batch_size)
chodzi o ogólnym przypadku : Niezależnie od tego, czy przypisujesz nową wartość do istniejącej już nazwy, czy do nowej, nie ma absolutnie żadnej różnicy (przynajmniej z punktu widzenia interpretera/maszyny wirtualnej). Obie metody produkować niemal dokładnie ten sam kod bajtowy:
Python 2.7.2 (default, Nov 21 2011, 17:25:27)
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def func1(files):
... files = files[:100]
...
>>> def func2(files):
... new_files = files[:100]
...
>>> dis.dis(func1)
2 0 LOAD_FAST 0 (files)
3 LOAD_CONST 1 (100)
6 SLICE+2
7 STORE_FAST 0 (files)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> dis.dis(func2)
2 0 LOAD_FAST 0 (files)
3 LOAD_CONST 1 (100)
6 SLICE+2
7 STORE_FAST 1 (new_files)
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
To samo można zaobserwować w Pythonie 3.
W rzeczywistości func1
może być nawet nieco szybciej, ponieważ nazwa files
został widział i mógł już znajduje się w pamięci podręcznej zmiennych.
Nie widzę tutaj pytania. Jaka jest alternatywa do porównania? Używanie drugiej zmiennej, takiej jak 'files = XYZ; files_head = files [: batch_size] '? Dlaczego miałaby być jakaś różnica? –
alternatywa jest czymś w rodzaju: new_set_of_files = files [: batch_size] – jldupont
Od razu zauważysz główną: * Hej! Nadal potrzebuję tej starej wartości dla 'files'! *. – Droogans