Podle návrhu Python upřednostňuje pohodlí, čitelnost a snadné použití před výkonem. To ale neznamená, že byste se měli spokojit s pomalým kódem Pythonu. Pravděpodobně existuje něco, co můžete udělat, abyste to urychlili.
Mezi nástroji dostupnými pro profilování výkonu kódu Pythonu je nejjednodušší timeit
modul. timeit
se používá k měření rychlosti malých úryvků kódu - několik řádků, funkce - provedením kódu tisíckrát nebo dokonce milionkrát a hlášením, jak dlouho trvalo jejich provedení.
timeit
je nejužitečnější pro porovnání dvou nebo tří různých způsobů, jak něco udělat, a zjištění, který je nejrychlejší. Například smyčka, která běží pro tisíce iterací, je běžným úzkým hrdlem Pythonu. Pokud najdete způsob, jak urychlit implementaci této smyčky - řekněme pomocí vestavěných modulů Python místo ručně psaného kódu - můžete získat měřitelné zlepšení výkonu.
Jednoduchý příklad časového limitu Pythonu
Zde je jednoduchý příklad toho, jak timeit
práce:
def f1 (): for n in range (100): pass def f2 (): n = 0 while n <100: n + = 1 if __name__ == "__main__": import timeit print (timeit.timeit (f1, number = 100000)) print (timeit.timeit (f2, number = 100000))
Tento program porovnává výkon dvou způsobů, jak iterovat smyčkou 100krát: pomocí integrovaného Pythonurozsah
funkce (f1
) a zvýšením proměnné (f2
). timeit
běží každý z těchto přístupů 100 000krát a poskytuje každému na konci celkový běh. Ve výchozím stavu,timeit
používá jeden milion běhů, ale tento příklad ukazuje, jak můžete nastavit počet běhů na libovolný údaj, který se jeví jako vhodný.
Výsledky (z procesoru Intel i7-3770K):
0.12523150.45453989999999994
Je zřejmé, žerozsah
přístup je mnohem rychlejší, faktorem asi 3,75. To není překvapující; použití vestavěného Pythonu obvykle přináší lepší výkon než ruční manipulace s objekty Pythonu.
Použijte Python timeit předáním řetězce
Další způsob použitítimeit
je předat řetězec, který je vyhodnocen jako program v Pythonu:
importovat časprint (timeit.timeit ('for n in range (100): pass')))
To lze provést také z příkazového řádku:
python -m timeit "pro n v rozsahu (100): projít"
Celkově je ale jednodušší použít výše uvedenou techniku, protože svůj kód nemusíte nijak neobtěžovat pomocí textového řetězce.
Tipy pro Python timeit
Stejně užitečné jakotimeit
je, mějte na paměti tyto námitky ohledně toho, jak ji používat.
Nepoužívejte timeit pro profilování celého programu
Nic ti neříkánemůže celý program stimeit
. Například jednoduchý 10řádkový skript není špatným kandidátem na to, aby byl takto profilován.
Existují však lepší nástroje pro tuto práci - například Python'scProfil
modul, který generuje mnohem podrobnější statistiky o výkonu celého vašeho programu. timeit
funguje nejlépe s jednou komponentou nebo fragmentem kódu - opět s funkcí nebo několika řádky kódu. Cokoli jiného než obvykle generuje výsledky, které jsou příliš hlučné a nekonzistentní, aby vám poskytly jakékoli smysluplné informace o výkonu.
Pokud program, který profilováte, trvá také několik minut,timeit
nebude k ničemu. Zaprvé bude trvat příliš dlouho, než se kód spustí několikrát, takže shromážděná časování budou velmi hrubá. Pro dva jsou pro tuto práci vhodnější jiné nástroje.
Provádějte více časových běhů na různých strojích
Programy neběží pokaždé stejnou rychlostí. Moderní výpočetní prostředí přináší velkou nejistotu - konkurenci s jinými programy o zdroje, chování mezipaměti, plánování atd.timeit
se to snaží kompenzovat provedením kódu ad infinitum, ale je stále dobrý nápad agregovat více pokusů. Měli byste spustittimeit
profilujte mnohokrát, vyhodte nejhorší a nejlepší skóre a zbytek zprůměrujte.
Nakonec to také pomůže spustit stejný test na různých systémech: jak se bude chovat něco vázaného na disk na SSD oproti konvenčnímu rotujícímu pevnému disku? Stejně jako u jakékoli jiné otázky týkající se výkonu - nehádejte, testujte.