Python Timeit használata a kód időzítésére

Ebben az oktatóanyagban megtudhatja, hogyan kell használni a timeit függvényt a Python timeit moduljából. Megtanulja, hogyan kell időzíteni az egyszerű kifejezéseket és függvényeket Pythonban.

A kód időzítése segíthet megbecsülni egy kódrészlet végrehajtási idejét, és meghatározhatja a kód optimalizálandó szakaszait.

Kezdjük azzal, hogy megtanuljuk a Python timeit függvényének szintaxisát. Ezután példákat kódolunk, hogy megértsük, hogyan kell használni a Python-modul kód- és függvényblokkjainak időzítésére. Kezdjük.

A Python timeit függvény használata

A timeit modul a Python szabványos könyvtárának része, és importálhatja:

import timeit

A timeit modulból származó timeit függvény használatának szintaxisa a következő:

timeit.timeit(stmt, setup, number)

Itt:

  • Az stmt az a kódrészlet, amelynek végrehajtási idejét mérni kell. Megadhatja egyszerű Python karakterláncként vagy többsoros karakterláncként, vagy átadhatja a hívható nevét.
  • Ahogy a neve is sugallja, a setup azt a kódrészletet jelöli, amelynek csak egyszer kell futnia, gyakran az stmt futtatásának előfeltételeként. Tegyük fel például, hogy egy NumPy tömb létrehozásának végrehajtási idejét számítja ki. Ebben az esetben a numpy importálása a beállítási kód, a tényleges létrehozás pedig az időzítendő utasítás.
  • A paraméter száma az stmt futtatásának számát jelöli. A szám alapértelmezett értéke 1 millió (1000000), de ezt a paramétert tetszőleges más értékre is beállíthatja.

Most, hogy megtanultuk a timeit() függvény használatának szintaxisát, kezdjünk el néhány példát kódolni.

Az egyszerű Python-kifejezések időzítése

Ebben a részben megpróbáljuk mérni az egyszerű Python-kifejezések végrehajtási idejét a timeit segítségével.

Indítson el egy Python REPL-t, és futtassa a következő kódpéldákat. Itt a hatványozási és szintosztási műveletek végrehajtási idejét számítjuk ki 10000 és 100000 futtatásra.

Figyeljük meg, hogy az időzítendő utasítást Python-karakterláncként adjuk át, és pontosvesszőt használunk az utasítás különböző kifejezéseinek elválasztására.

>>> import timeit
>>> timeit.timeit('3**4;3//4',number=10000)
0.0004020999999738706

>>> timeit.timeit('3**4;3//4',number=100000)
0.0013780000000451764

Python timeit futtatása a parancssorban

A timeit parancssorban is használhatja. Íme a timeit függvényhívás parancssori megfelelője:

$ python-m timeit -n [number] -s [setup] [stmt]
  • python -m timeit azt jelenti, hogy a timeit fő modult futtatjuk.
  • Az n egy parancssori kapcsoló, amely azt jelzi, hogy a kódnak hányszor kell lefutnia. Ez megegyezik a timeit() függvényhívás szám argumentumával.
  • A beállítási kód megadásához használhatja a -s kapcsolót.
  A Netflix régió megváltoztatása és bármely Netflix ország megtekintése (minden eszközön)

Itt átírjuk az előző példát a parancssori megfelelővel:

$ python -m timeit -n 100000 '3**4;3//4'
100000 loops, best of 5: 35.8 nsec per loop

Ebben a példában a beépített len() függvény végrehajtási idejét számítjuk ki. A karakterlánc inicializálása az s kapcsolóval átadott beállítási kód.

$ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)'
100000 loops, best of 5: 239 nsec per loop

A kimenetben figyelje meg, hogy megkapjuk az 5 legjobb futtatás végrehajtási idejét. Mit is jelent ez? Amikor a timeit parancsot futtatja a parancssorban, az r ismétlési beállítás alapértelmezett értéke 5. Ez azt jelenti, hogy az stmt végrehajtása a megadott számú alkalommal ötször megismétlődik, és a végrehajtási idők közül a legjobbat adja vissza.

A karakterlánc-visszafordítási módszerek elemzése timeit használatával

Amikor Python-karakterláncokkal dolgozik, érdemes lehet azokat megfordítani. A karakterlánc-visszafordítás két leggyakoribb megközelítése a következő:

  • Szúrószeletelés használata
  • A fordított() függvény és a join() metódus használata

Fordított Python-karakterláncok karakterláncszeletelés segítségével

Nézzük meg, hogyan működik a karakterláncszeletelés, és hogyan fordíthatja meg Python-karakterláncot. A some-string szintaxis használata[start:stop] visszaadja a karakterlánc egy szeletét, amely az index kezdetétől kezdődik és az index stop-1-ig terjed. Vegyünk egy példát.

Tekintsük a következő „Python” karakterláncot. A karakterlánc hossza 6, az indexek listája pedig 0, 1, 2 és 5 között.

>>> string_1 = 'Python'

Ha megadja a start és a stop értékeket is, akkor egy karakterláncszeletet kap, amely az elejétől a stop-1-ig terjed. Ezért a string_1[1:4] ‘yth’-t adja vissza.

  Hogyan játssz 7 napot a halálig Linuxon

>>> string_1 = 'Python'
>>> string_1[1:4]
'yth'

Ha nem adja meg a kezdőértéket, a rendszer az alapértelmezett nulla kezdőértéket használja, és a szelet a nulla indexnél kezdődik, és egészen a leállításig – 1 -ig terjed.

Itt a stop érték 3, tehát a szelet a 0 indexnél kezdődik és a 2-es indexig megy fel.

>>> string_1[:3]
'Pyt'

Ha nem tartalmazza a stop indexet, akkor azt látja, hogy a szelet a kezdőindextől (1) kezdődik és a karakterlánc végéig tart.

>>> string_1[1:]
'ython'

A start és a stop értékek figyelmen kívül hagyása a teljes karakterlánc egy szeletét adja vissza.

>>> string_1[::]
'Python'

Hozzunk létre egy szeletet a lépésértékkel. Állítsa a start, stop és step értékeket 1-re, 5-re és 2-re. Az 1-től kezdődő karakterlánc 4-ig terjedő szeletét kapjuk (az 5-ös végpont kivételével), amely minden második karaktert tartalmaz.

>>> string_1[1:5:2]
'yh'

Ha negatív lépést használ, egy szeletet kaphat, amely a karakterlánc végén kezdődik. Ha a lépést -2-re állítja, a string_1[5:2:-2] a következő szeletet adja:

>>> string_1[5:2:-2]
'nh'

Tehát a karakterlánc fordított másolatának megszerzéséhez kihagyjuk a kezdő és leállítási értékeket, és a lépést -1-re állítjuk, amint az ábrán látható:

>>> string_1[::-1]
'nohtyP'

Összefoglalva: string[::-1] a karakterlánc fordított másolatát adja vissza.

Karakterláncok megfordítása beépített függvényekkel és karakterlánc-módszerekkel

A Python beépített reverse() függvénye egy fordított iterátort ad vissza a karakterlánc elemei felett.

>>> string_1 = 'Python'
>>> reversed(string_1)
<reversed object at 0x00BEAF70>

Így a for hurok használatával ismételgethet a fordított iterátoron:

for char in reversed(string_1):
    print(char)

És a karakterlánc elemeit fordított sorrendben érheti el.

# Output
n
o
h
t
y
P

Ezután meghívhatja a join() metódust a fordított iterátorban a következő szintaxissal: .join(reversed(some-string)).

Az alábbi kódrészlet néhány példát mutat be, ahol az elválasztó egy kötőjel, illetve egy szóköz.

>>> '-'.join(reversed(string1))
'n-o-h-t-y-P'
>>> ' '.join(reversed(string1))
'n o h t y P'

Itt nem akarunk semmilyen elválasztót; tehát állítsa az elválasztót üres karakterláncra, hogy a karakterlánc fordított másolatát kapja:

>>> ''.join(reversed(string1))
'nohtyP'

A .join(reversed(some-string)) használata a karakterlánc fordított másolatát adja vissza.

A végrehajtási idők összehasonlítása timeit használatával

Eddig két megközelítést tanultunk meg a Python-sztringek visszafordítására. De melyikük a gyorsabb? Találjuk ki.

  Hogyan csoportosítsunk munkalapokat Excelben

Egy korábbi példában, ahol egyszerű Python-kifejezéseket időzítettünk, nem volt beállítási kódunk. Itt megfordítjuk a Python karakterláncot. Míg a karakterlánc-visszafordítási művelet a szám által megadott számú alkalommal fut, a beállítási kód a karakterlánc inicializálása, amely csak egyszer fut le.

>>> import timeit
>>> timeit.timeit(stmt="string_1[::-1]", setup = "string_1 = 'Python'", number = 100000)
0.04951830000001678
>>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000)
0.12858760000000302

Az adott karakterlánc megfordításának ugyanannyi futtatása esetén a karakterlánc-szeletelés gyorsabb, mint a join() metódus és a reversed() függvény használata.

Python-függvények időzítése Timeit használatával

Ebben a részben megtudjuk, hogyan kell időzíteni a Python függvényeket a timeit függvénnyel. Ha adott egy karakterlánc-lista, a következő hasDigit függvény a legalább egy számjegyet tartalmazó karakterláncok listáját adja vissza.

def hasDigit(somelist):
     str_with_digit = []
     for string in somelist:
         check_char = [char.isdigit() for char in string]
         if any(check_char):
            str_with_digit.append(string)
     return str_with_digit

Most ennek a Python-függvénynek a hasDigit() végrehajtási idejét szeretnénk mérni a timeit segítségével.

Először azonosítsuk az időzítendő utasítást (stmt). Ez a hasDigit() függvény hívása, argumentumként a karakterláncok listájával. Ezután határozzuk meg a beállítási kódot. Kitalálod, hogy mi legyen a beállítási kód?

A függvényhívás sikeres futtatásához a beállítási kódnak tartalmaznia kell a következőket:

  • A hasDigit() függvény meghatározása
  • A karakterláncok argumentumlistájának inicializálása

Határozzuk meg a beállítási kódot a beállítási karakterláncban, az alábbiak szerint:

setup = """
def hasDigit(somelist):
    str_with_digit = []
    for string in somelist:
      check_char = [char.isdigit() for char in string]
      if any(check_char):
        str_with_digit.append(string)
    return str_with_digit
thislist=['puffin3','7frost','blue']
     """

Ezután használhatjuk a timeit függvényt, és megkaphatjuk a hasDigit() függvény végrehajtási idejét 100 000 futtatásra.

import timeit
timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
# Output
0.2810094920000097

Következtetés

Megtanulta, hogyan használhatja a Python timeit függvényét kifejezések, függvények és egyéb hívható elemek időzítésére. Ez segíthet a kód összehasonlításában, összehasonlíthatja ugyanazon funkció különböző implementációinak végrehajtási idejét, és így tovább.

Tekintsük át, mit tanultunk ebben az oktatóanyagban. A timeit() függvény a timeit.timeit(stmt=…,setup=…,number=…) szintaxissal használható. Alternatív megoldásként futtathatja a timeit parancsot a rövid kódrészletek időzítéséhez.

Következő lépésként megvizsgálhatja, hogyan használhat más Python profilkészítő csomagokat, például a line-profilert és a memprofilert a kód idő- és memóriaprofiljához.

Ezután tanulja meg, hogyan kell kiszámítani az időkülönbséget Pythonban.