Izmantojot Python Timeit, lai iestatītu kodu kodu

Šajā apmācībā jūs uzzināsit, kā izmantot Timeit funkciju no Python moduļa timeit. Jūs uzzināsit, kā noteikt laiku vienkāršām izteiksmēm un funkcijām programmā Python.

Koda laika noteikšana var palīdzēt jums aprēķināt koda daļas izpildes laiku, kā arī noteikt koda sadaļas, kas ir jāoptimizē.

Mēs sāksim, apgūstot Python funkcijas timeit sintaksi. Un tad mēs kodēsim piemērus, lai saprastu, kā to izmantot koda un funkciju bloku laika noteikšanai jūsu Python modulī. Sāksim.

Kā izmantot Python timeit funkciju

Modulis timeit ir daļa no Python standarta bibliotēkas, un jūs varat to importēt:

import timeit

Sintakse, lai izmantotu timeit funkciju no timeit moduļa, ir šāda:

timeit.timeit(stmt, setup, number)

Šeit:

  • stmt ir koda gabals, kura izpildes laiks ir jāmēra. Varat norādīt to kā vienkāršu Python virkni vai vairāku rindu virkni vai ievadīt izsaucamās daļas nosaukumu.
  • Kā norāda nosaukums, iestatīšana apzīmē koda daļu, kas jāpalaiž tikai vienu reizi, bieži vien kā priekšnoteikums stmt palaišanai. Piemēram, pieņemsim, ka aprēķina izpildes laiku NumPy masīva izveidei. Šajā gadījumā importēšana numpy ir iestatīšanas kods, un faktiskā izveide ir priekšraksts, kas jāievada laikā.
  • Parametra numurs apzīmē stmt izpildes reižu skaitu. Skaitļa noklusējuma vērtība ir 1 miljons (1000000), taču varat arī iestatīt šo parametru uz jebkuru citu vērtību pēc savas izvēles.

Tagad, kad esam iemācījušies funkcijas timeit() izmantošanas sintaksi, sāksim kodēt dažus piemērus.

Vienkāršu Python izteiksmju laiks

Šajā sadaļā mēs mēģināsim izmērīt vienkāršu Python izteiksmju izpildes laiku, izmantojot timeit.

Sāciet Python REPL un palaidiet šādus koda piemērus. Šeit mēs aprēķinām kāpināšanas un grīdas dalīšanas operāciju izpildes laiku 10000 un 100000 gājieniem.

Ņemiet vērā, ka mēs nododam priekšrakstu, kas tiks iestatīts kā Python virkne, un izmantojam semikolu, lai atdalītu dažādās izteiksmes.

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

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

Palaižot Python timeit komandrindā

Varat arī izmantot timeit komandrindā. Šeit ir komandrindas ekvivalents funkcijas timeit izsaukumam:

$ python-m timeit -n [number] -s [setup] [stmt]
  • python -m timeit norāda, ka mēs palaižam timeit kā galveno moduli.
  • n ir komandrindas opcija, kas norāda koda palaišanas reižu skaitu. Tas ir līdzvērtīgs skaitļa argumentam timeit() funkcijas izsaukumā.
  • Varat izmantot opciju -s, lai definētu iestatīšanas kodu.
  Kā reģistrēties Talkatone

Šeit mēs pārrakstām iepriekšējo piemēru, izmantojot komandrindas ekvivalentu:

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

Šajā piemērā mēs aprēķinām iebūvētās funkcijas len() izpildes laiku. Virknes inicializācija ir iestatīšanas kods, kas tiek nodots, izmantojot opciju s.

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

Izvadē ievērojiet, ka mēs iegūstam izpildes laiku labākajam no 5 piegājieniem. Ko tas nozīmē? Palaižot timeit komandrindā, atkārtošanas opcijai r tiek iestatīta noklusējuma vērtība 5. Tas nozīmē, ka stmt izpilde noteiktajam reižu skaitam tiek atkārtota piecas reizes, un tiek atgriezts labākais izpildes laiks.

Virkņu maiņas metožu analīze, izmantojot timeit

Strādājot ar Python virknēm, iespējams, vēlēsities tās mainīt. Divas visizplatītākās virkņu maiņas metodes ir šādas:

  • Izmantojot stīgu sagriešanu
  • Izmantojot funkciju reversed() un join() metodi

Apgrieztās Python virknes, izmantojot virkņu sagriešanu

Apskatīsim, kā darbojas virkņu sadalīšana un kā to izmantot, lai apgrieztu Python virkni. Izmantojot sintaksi some-string[start:stop] atgriež virknes daļu, kas sākas ar indeksa sākumu un stiepjas līdz indeksa stop-1. Ņemsim piemēru.

Apsveriet šādu virkni „Python”. Virknes garums ir 6, un indeksu saraksts ir no 0, 1, 2 līdz 5.

>>> string_1 = 'Python'

Kad norādāt gan sākuma, gan beigu vērtības, tiek iegūta virknes daļa, kas stiepjas no sākuma līdz beigām-1. Tāpēc string_1[1:4] atgriež „yth”.

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

Ja nenorāda sākuma vērtību, tiek izmantota noklusējuma sākuma vērtība nulle, un sadaļa sākas ar indeksu nulli un stiepjas līdz beigai — 1.

  Kā Dropbox atrast konfliktējošus failus

Šeit apturēšanas vērtība ir 3, tāpēc sadaļa sākas ar indeksu 0 un iet uz augšu līdz indeksam 2.

>>> string_1[:3]
'Pyt'

Ja neiekļaujat apturēšanas indeksu, jūs redzat, ka sadaļa sākas no sākuma indeksa (1) un stiepjas līdz virknes beigām.

>>> string_1[1:]
'ython'

Ignorējot gan sākuma, gan beigu vērtības, tiek atgriezta daļa no visas virknes.

>>> string_1[::]
'Python'

Izveidosim šķēli ar soļa vērtību. Iestatiet sākuma, beigšanas un soļa vērtības attiecīgi uz 1, 5 un 2. Mēs iegūstam virknes daļu, kas sākas ar 1, kas stiepjas līdz 4 (izņemot beigu punktu 5), kurā ir katra otrā rakstzīme.

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

Ja izmantojat negatīvu soli, varat iegūt daļu, kas sākas virknes beigās. Ja darbība ir iestatīta uz -2, virkne_1[5:2:-2] dod šādu šķēli:

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

Tātad, lai iegūtu virknes apgrieztu kopiju, mēs izlaižam sākuma un beigu vērtības un iestatām soli uz -1, kā parādīts attēlā:

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

Rezumējot: virkne[::-1] atgriež apgrieztu virknes kopiju.

Virkņu apgriešana, izmantojot iebūvētās funkcijas un virkņu metodes

Python iebūvētā funkcija reversed() atgriezīs virknes elementu apgriezto iteratoru.

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

Tātad jūs varat veikt cilpu caur reverso iteratoru, izmantojot for cilpu:

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

Un piekļūstiet virknes elementiem apgrieztā secībā.

# Output
n
o
h
t
y
P

Pēc tam varat izsaukt join() metodi reversajā iteratorā ar sintaksi: .join(reversed(some-string)).

Tālāk esošajā koda fragmentā ir parādīti daži piemēri, kur atdalītājs ir attiecīgi defise un atstarpe.

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

Šeit mēs nevēlamies nekādu atdalītāju; tāpēc iestatiet atdalītāju uz tukšu virkni, lai iegūtu virknes apgrieztu kopiju:

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

Izmantojot .join(reversed(some-string)), tiek atgriezta virknes apgriezta kopija.

Izpildes laiku salīdzināšana, izmantojot timeit

Līdz šim mēs esam apguvuši divas pieejas Python virkņu apvēršanai. Bet kurš no tiem ir ātrāks? Noskaidrosim.

Iepriekšējā piemērā, kurā mēs iestatījām vienkāršas Python izteiksmes, mums nebija iestatīšanas koda. Šeit mēs apgriežam Python virkni. Kamēr virknes apgriešanas darbība tiek izpildīta ar skaitli norādīto reižu skaitu, iestatīšanas kods ir virknes inicializācija, kas tiks izpildīta tikai vienu reizi.

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

Ar tādu pašu darbību skaitu, lai apgrieztu doto virkni, virknes sadalīšanas pieeja ir ātrāka nekā savienojuma () metodes un reversed () funkcijas izmantošana.

  Kā novērst kļūdu “Kaut kas nogāja greizi, lejupielādējot jūsu veidni”.

Laika noteikšana Python funkcijas Timeit izmantošana

Šajā sadaļā uzzināsim, kā noteikt Python funkciju laiku, izmantojot funkciju timeit. Ņemot vērā virkņu sarakstu, tālāk norādītā funkcija hasDigit atgriež to virkņu sarakstu, kurās ir vismaz viens cipars.

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

Tagad mēs vēlētos izmērīt šīs Python funkcijas hasDigit() izpildes laiku, izmantojot timeit.

Vispirms noteiksim priekšrakstu, kuram jāaprēķina laiks (stmt). Tas ir funkcijas hasDigit() izsaukums ar virkņu sarakstu kā argumentu. Tālāk definēsim iestatīšanas kodu. Vai varat uzminēt, kādam jābūt iestatīšanas kodam?

Lai funkcijas izsaukums darbotos veiksmīgi, iestatīšanas kodā ir jāietver:

  • Funkcijas hasDigit() definīcija
  • Virkņu argumentu saraksta inicializācija

Iestatīšanas virknē definēsim iestatīšanas kodu, kā parādīts tālāk:

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']
     """

Tālāk mēs varam izmantot funkciju timeit un iegūt funkcijas hasDigit() izpildes laiku 100 000 gājieniem.

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

Secinājums

Jūs esat iemācījušies izmantot Python funkciju timeit, lai ieplānotu izteiksmes, funkcijas un citus izsaucamos parametrus. Tas var palīdzēt veikt koda etalonu, salīdzināt vienas un tās pašas funkcijas dažādu implementāciju izpildes laikus un veikt citas darbības.

Apskatīsim, ko esam iemācījušies šajā apmācībā. Funkciju timeit() var izmantot ar sintaksi timeit.timeit(stmt=…,setup=…,number=…). Varat arī palaist timeit komandrindā, lai ieplānotu īsus koda fragmentus.

Nākamajā darbībā varat izpētīt, kā izmantot citas Python profilēšanas pakotnes, piemēram, līniju profilu un memprofiler, lai attiecīgi profilētu savu kodu laika un atmiņas vajadzībām.

Pēc tam uzziniet, kā aprēķināt laika starpību programmā Python.