Programování

Jak používat timeit k profilování kódu Pythonu

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.1252315

0.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 čas

print (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.

$config[zx-auto] not found$config[zx-overlay] not found