W niniejszym artykule przyjrzymy się, jak w kilku prostych krokach ustalić rozmiar listy oraz przeanalizujemy efektywność poszczególnych podejść.
Czym jest lista w Pythonie?
Lista w Pythonie to struktura danych, która umożliwia przechowywanie różnorodnych elementów. Może ona zawierać dane typu całkowitego, zmiennoprzecinkowego, tekstowego, logicznego, a nawet inne listy.
int_list = [1, 2, 3, 4, 5] print(int_list) # output -> [1, 2, 3, 4, 5] float_list = [1.1, 2.2, 3.3, 4.4, 5.5] print(float_list) # output -> [1.1, 2.2, 3.3, 4.4, 5.5] string_list = ['Geekflare', 'Cloudflare', 'Amazon'] print(string_list) # output -> ['Geekflare', 'Cloudflare', 'Amazon'] boolean_list = [True, False] print(boolean_list) # output -> [True, False] nested_list = [[1, 2], [1.1, 2.2], ['Geekflare', 'Cloudflare'], [True, False]] print(nested_list) # [[1, 2], [1.1, 2.2], ['Geekflare', 'Cloudflare'], [True, False]] different_datatype_list = [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]] print(different_datatype_list) # output -> [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]]
Listy w Pythonie można tworzyć za pomocą nawiasów kwadratowych lub używając konstruktora `list()`.
square_bracket_list = [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]] print(square_bracket_list) # output -> [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]] constructor_list = list((1, 1.1, 'newsblog.pl', True, [1, 1.1, 'Geekflare', True])) print(constructor_list) # output -> [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]]
Powyżej, `square_bracket_list` została utworzona za pomocą nawiasów kwadratowych `[]`, natomiast `constructor_list` z użyciem konstruktora `list()`. Obie metody prowadzą do powstania identycznych list.
Lista jest strukturą modyfikowalną, dopuszcza elementy powtarzające się i umożliwia dostęp do danych poprzez indeks.
Sposoby na ustalenie długości listy
- Wbudowana funkcja `len()`
- Metoda `length_hint` z modułu `operator`
- Niestandardowa funkcja z licznikiem
Metoda 1: Wbudowana funkcja `len()`
Funkcja `len()` jest wbudowaną funkcją Pythona, która zwraca liczbę elementów w liście, a także innych obiektach iterowalnych, takich jak zbiory, krotki czy słowniki.
Przykładowy kod:
languages = ['Python', 'Java', 'C++', 'PHP', 'nodeJS'] languages_length = len(languages) print('Długość listy języków wynosi: ',languages_length)
Wynik:
Długość listy języków wynosi: 5
Jeśli nie masz jeszcze Pythona, zachęcamy do skorzystania z kompilatora online, aby przećwiczyć przedstawiony kod.
Metoda 2: Metoda `length_hint` z modułu `operator`
Metoda `length_hint` służy do pobierania orientacyjnej długości obiektów iterowalnych, takich jak listy, zbiory, krotki i słowniki. Jest ona dostępna w module `operator` Pythona i nie jest tak powszechnie znana, jak standardowe operatory wbudowane.
Przykładowy kod:
import operator languages = ['Python', 'Java', 'C++', 'PHP', 'nodeJS'] languages_length = operator.length_hint(languages) print('Długość listy języków przy użyciu operatora: ',languages_length)
Wynik:
Długość listy języków przy użyciu operatora: 5
Metoda 3: Niestandardowa funkcja z licznikiem
W tym podejściu do obliczenia długości listy wykorzystamy tradycyjną metodę, implementując pętlę `for` i licznik.
Stworzymy funkcję w Pythonie, która przyjmie listę (lub inny obiekt iterowalny) jako argument i zwróci liczbę jej elementów.
Fragment funkcji:
def iterable_count(iterable): length = 0 for item in iterable: length+=1 return length
Przykładowy kod:
def iterable_count(iterable): length = 0 for item in iterable: length+=1 return length languages = ['Python', 'Java', 'C++', 'PHP', 'nodeJS'] languages_length = iterable_count(languages) print('Długość listy języków za pomocą funkcji: ',languages_length)
Wynik:
Długość listy języków za pomocą funkcji: 5
Analiza porównawcza trzech metod
Test wydajności na dużej liście:
import timeit # do testowania wydajności import operator def iterable_count(iterable): length = 0 for item in iterable: length+=1 return length integer_list = list(range(1, 9999999)) #sprawdzenie długości za pomocą len() start_time = timeit.default_timer() len_length = len(integer_list) print(timeit.default_timer() - start_time, 'Długość listy liczb całkowitych za pomocą len() wynosi: ',len_length) #sprawdzenie długości za pomocą operator.length_hint start_time = timeit.default_timer() len_length = operator.length_hint(integer_list) print(timeit.default_timer() - start_time, 'Długość listy liczb całkowitych za pomocą length_hint wynosi: ',len_length) start_time = timeit.default_timer() iterable_count_length = iterable_count(integer_list) print(timeit.default_timer() - start_time, 'Długość listy liczb całkowitych za pomocą funkcji wynosi: ',iterable_count_length)
Wynik:
3.957189619541168e-06 Długość listy liczb całkowitych za pomocą len() wynosi: 9999998 3.0621886253356934e-06 Długość listy liczb całkowitych za pomocą length_hint wynosi: 9999998 0.4059128537774086 Długość listy liczb całkowitych za pomocą funkcji wynosi: 9999998
Jak widać, `length_hint` jest szybsze (3.0621886253356934e-06), gdy lista zawiera miliony elementów. Wynika to z faktu, że `length_hint` jest zoptymalizowana w środowisku CPython, gdzie wywoływane jest natywnie.
Test wydajności na małej liście:
import timeit # do testowania wydajności import operator def iterable_count(iterable): length = 0 for item in iterable: length+=1 return length integer_list = list(range(1, 100)) #sprawdzenie długości za pomocą len() start_time = timeit.default_timer() len_length = len(integer_list) print(timeit.default_timer() - start_time, 'Długość listy liczb całkowitych za pomocą len() wynosi: ',len_length) #sprawdzenie długości za pomocą operator.length_hint start_time = timeit.default_timer() len_length = operator.length_hint(integer_list) print(timeit.default_timer() - start_time, 'Długość listy liczb całkowitych za pomocą length_hint wynosi: ',len_length) start_time = timeit.default_timer() iterable_count_length = iterable_count(integer_list) print(timeit.default_timer() - start_time, 'Długość listy liczb całkowitych za pomocą funkcji wynosi: ',iterable_count_length)
Wynik:
7.813796401023865e-07 Długość listy liczb całkowitych za pomocą len() wynosi: 99 1.1278316378593445e-06 Długość listy liczb całkowitych za pomocą length_hint wynosi: 99 3.462657332420349e-06 Długość listy liczb całkowitych za pomocą funkcji wynosi: 99
Jak widać, `len()` jest szybsze (7.813796401023865e-07), gdy lista zawiera tysiąc elementów lub mniej.
W obu przypadkach nasza niestandardowa funkcja z licznikiem okazała się najmniej wydajna.
Podsumowanie
W tym artykule omówiliśmy różne metody sprawdzania długości list w Pythonie oraz przeanalizowaliśmy ich wydajność. Okazuje się, że standardowa funkcja `len()` oraz funkcja `length_hint` oferują najlepszą efektywność, a wybór między nimi zależy od rozmiaru przetwarzanych danych.