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.
Tartalomjegyzé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.
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.
>>> 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:
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.
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.