Jeśli ciągle wywołuję len () z bardzo długiej listy, czy marnuję czas, czy też utrzymuje licznik int w tle?
Odpowiedzi:
Nie martw się: oczywiście oszczędza liczbę, a zatem len()na listach jest to dość tania operacja. Nawiasem mówiąc, to samo dotyczy ciągów znaków, słowników i zestawów!
I jeszcze jeden sposób, aby dowiedzieć się, jak to się robi aby znaleźć to w Google Code Search spójrz na źródło na GitHub , jeśli nie chcesz samodzielnie pobierać źródła.
static Py_ssize_t list_length(PyListObject *a)
{
return a->ob_size;
}
Napisz swój program tak, aby był zoptymalizowany pod kątem przejrzystości i łatwy w utrzymaniu . Czy Twój program jest bardziej przejrzysty dzięki wezwaniu do len(foo)? Więc zrób to.
Martwisz się o czas? Skorzystaj z timeitmodułu w bibliotece standardowej, aby zmierzyć wymagany czas i sprawdzić, czy jest on istotny w Twoim kodzie.
Podobnie jak większość ludzi, najprawdopodobniej błędnie zgadniesz, które części programu są najwolniejsze. Unikaj pokusy zgadywania i zamiast tego zmierz ją, aby się dowiedzieć.
Pamiętaj, że przedwczesna optymalizacja jest źródłem wszelkiego zła , jak mówi Donald Knuth. Skoncentruj się tylko na szybkości kodu, którą zmierzyłeś , aby wiedzieć, czy korzyść byłaby warta kosztu zmiany sposobu działania.
Na pytanie udzielono odpowiedzi ( lenjest O (1)), ale oto jak możesz to sprawdzić samodzielnie:
$ python -m timeit -s "l = range(10)" "len(l)"
10000000 loops, best of 3: 0.119 usec per loop
$ python -m timeit -s "l = range(1000000)" "len(l)"
10000000 loops, best of 3: 0.131 usec per loop
Tak, niezbyt wolniej.
Musi gdzieś przechowywać długość, więc nie liczysz za każdym razem liczby elementów.