V tomto článku si ukážeme, jakými způsoby můžeme zjistit délku seznamu v Pythonu. Porovnáme různé metody a analyzujeme jejich efektivitu.
Co je to Python Seznam?
Seznam (list) je v Pythonu kolekce položek, která umožňuje ukládat různé datové typy. Do jednoho seznamu můžeme vložit celá čísla, čísla s plovoucí desetinnou čárkou, řetězce, logické hodnoty nebo dokonce i další seznamy.
Níže si ukážeme příklady různých seznamů:
int_list = [1, 2, 3, 4, 5] print(int_list) # výstup -> [1, 2, 3, 4, 5] float_list = [1.1, 2.2, 3.3, 4.4, 5.5] print(float_list) # výstup -> [1.1, 2.2, 3.3, 4.4, 5.5] string_list = ['Geekflare', 'Cloudflare', 'Amazon'] print(string_list) # výstup -> ['Geekflare', 'Cloudflare', 'Amazon'] boolean_list = [True, False] print(boolean_list) # výstup -> [True, False] nested_list = [[1, 2], [1.1, 2.2], ['Geekflare', 'Cloudflare'], [True, False]] print(nested_list) # výstup -> [[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) # výstup -> [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]]
Seznamy v Pythonu je možné vytvářet buď pomocí hranatých závorek nebo pomocí konstruktoru list()
.
Zde je ukázka obou způsobů:
square_bracket_list = [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]] print(square_bracket_list) # výstup -> [1, 1.1, 'Geekflare', True, [1, 1.1, 'Geekflare', True]] constructor_list = list((1, 1.1, 'etechblog.cz', True, [1, 1.1, 'Geekflare', True])) print(constructor_list) # výstup -> [1, 1.1, 'etechblog.cz', True, [1, 1.1, 'Geekflare', True]]
Oba způsoby vytvoření seznamu vedou ke stejnému výsledku. Seznamy jsou v Pythonu dynamické, umožňují duplikace prvků a k prvkům se přistupuje pomocí indexů.
Možnosti zjištění délky seznamu
Délku seznamu můžeme v Pythonu zjistit třemi hlavními způsoby:
- Pomocí vestavěné funkce
len()
. - S použitím metody
length_hint
z moduluoperator
. - Implementací vlastní funkce s čítačem.
Metoda 1: Vestavěná funkce len()
Funkce len()
je standardní součástí Pythonu a slouží ke zjištění počtu prvků v různých datových strukturách, včetně seznamů, množin, n-tic a slovníků.
Příklad:
languages = ['Python', 'Java', 'C++', 'PHP', 'nodeJS'] languages_length = len(languages) print('Délka seznamu jazyků je: ',languages_length)
Výstup:
Délka seznamu jazyků je: 5
Pokud nemáte Python nainstalovaný, můžete k testování kódu použít online interpret Pythonu.
Metoda 2: Metoda length_hint z modulu operator
Metoda length_hint
je součástí modulu operator
a vrací odhadovanou délku iterovatelného objektu. Je nutné ji importovat a není dostupná jako vestavěná funkce.
Příklad:
import operator languages = ['Python', 'Java', 'C++', 'PHP', 'nodeJS'] languages_length = operator.length_hint(languages) print('Délka seznamu jazyků s operátorem je: ',languages_length)
Výstup:
Délka seznamu jazyků s operátorem je: 5
Metoda 3: Vlastní funkce s počítadlem
Tato metoda využívá klasický postup iterace pomocí for
smyčky a čítače.
Napíšeme si vlastní funkci, která přijme jako argument iterovatelný objekt a vrátí jeho délku.
Kód funkce:
def iterable_count(iterable): length = 0 for item in iterable: length+=1 return length
Použití funkce:
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élka seznamu jazyků pomocí vlastní funkce je: ',languages_length)
Výstup:
Délka seznamu jazyků pomocí vlastní funkce je: 5
Analýza efektivnosti jednotlivých metod
Následuje porovnání výkonu jednotlivých metod pro velký seznam:
import timeit import operator def iterable_count(iterable): length = 0 for item in iterable: length+=1 return length integer_list = list(range(1, 9999999)) #délka pomocí len() start_time = timeit.default_timer() len_length = len(integer_list) print(timeit.default_timer() - start_time, 'Délka celočíselného seznamu pomocí len() je: ',len_length) #délka pomocí operator.length_hint start_time = timeit.default_timer() len_length = operator.length_hint(integer_list) print(timeit.default_timer() - start_time, 'Délka celočíselného seznamu pomocí length_hint je: ',len_length) start_time = timeit.default_timer() iterable_count_length = iterable_count(integer_list) print(timeit.default_timer() - start_time, 'Délka celočíselného seznamu pomocí vlastní funkce je: ',iterable_count_length)
Výstup:
3.957189619541168e-06 Délka celočíselného seznamu pomocí len() je: 9999998 3.0621886253356934e-06 Délka celočíselného seznamu pomocí length_hint je: 9999998 0.4059128537774086 Délka celočíselného seznamu pomocí vlastní funkce je: 9999998
Jak je vidět, metoda length_hint
je nejrychlejší (3.0621886253356934e-06) pro velké objemy dat. Je to proto, že length_hint
využívá interní optimalizace běhového prostředí CPython.
Analýza výkonu pro menší seznam:
import timeit import operator def iterable_count(iterable): length = 0 for item in iterable: length+=1 return length integer_list = list(range(1, 100)) #délka pomocí len() start_time = timeit.default_timer() len_length = len(integer_list) print(timeit.default_timer() - start_time, 'Délka celočíselného seznamu pomocí len() je: ',len_length) #délka pomocí operator.length_hint start_time = timeit.default_timer() len_length = operator.length_hint(integer_list) print(timeit.default_timer() - start_time, 'Délka celočíselného seznamu pomocí length_hint je: ',len_length) start_time = timeit.default_timer() iterable_count_length = iterable_count(integer_list) print(timeit.default_timer() - start_time, 'Délka celočíselného seznamu pomocí vlastní funkce je: ',iterable_count_length)
Výstup:
7.813796401023865e-07 Délka celočíselného seznamu pomocí len() je: 99 1.1278316378593445e-06 Délka celočíselného seznamu pomocí length_hint je: 99 3.462657332420349e-06 Délka celočíselného seznamu pomocí vlastní funkce je: 99
Pro menší seznamy je nejrychlejší funkce len()
(7.813796401023865e-07).
V obou testech byla naše vlastní funkce s čítačem nejpomalejší.
Závěr
V tomto článku jsme si prošli různé způsoby zjišťování délky seznamu v Pythonu a porovnali jsme jejich rychlost. Zjistili jsme, že pro malé seznamy je nejefektivnější funkce len()
, zatímco pro velké seznamy se více vyplatí používat metodu length_hint
z modulu operator
.