Sprawdź długość listy w Pythonie w 3 prostych krokach

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.