Коришћење Питхон Тимеит-а за време вашег кода

У овом водичу ћете научити како да користите функцију тимеит из Питхон-овог тимеит модула. Научићете како да мерите време једноставних израза и функција у Питхон-у.

Одређивање времена вашег кода може вам помоћи да добијете процену времена извршења дела кода и такође идентификујете делове кода које треба оптимизовати.

Почећемо тако што ћемо научити синтаксу Пајтонове функције тимеит. Затим ћемо дати примере кода да бисмо разумели како да га користите за временске блокове кода и функције у вашем Питхон модулу. Почнимо.

Како користити Питхон тимеит функцију

Модул тимеит је део Питхон стандардне библиотеке и можете да га увезете:

import timeit

Синтакса за коришћење функције тимеит из модула тимеит је као што је приказано у наставку:

timeit.timeit(stmt, setup, number)

овде:

  • стмт је део кода чије време извршавања треба да се мери. Можете га навести као једноставан Питхон стринг или вишелинијски стринг, или проследити име позивајућег.
  • Као што име каже, подешавање означава део кода који треба да се покрене само једном, често као предуслов за покретање стмт-а. На пример, претпоставимо да израчунавате време извршења за креирање НумПи низа. У овом случају, увоз нумпи је код за подешавање, а стварна креација је изјава која треба да се временски одреди.
  • Број параметра означава колико пута је стмт покренут. Подразумевана вредност броја је 1 милион (1000000), али такође можете подесити овај параметар на било коју другу вредност по вашем избору.

Сада када смо научили синтаксу за коришћење функције тимеит(), почнимо са кодирањем неких примера.

Временски једноставни Питхон изрази

У овом одељку ћемо покушати да измеримо време извршавања једноставних Питхон израза користећи тимеит.

Покрените Питхон РЕПЛ и покрените следеће примере кода. Овде израчунавамо време извршења операција експоненцијације и дељења спрата за 10000 и 100000 покрета.

  Како поделити Инстаграм објаву са својом причом

Обратите пажњу да наредбу прослеђујемо да буде временски ограничена као Питхон стринг и да користимо тачку и зарез да раздвојимо различите изразе у изјави.

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

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

Покретање Питхон тимеит-а у командној линији

Такође можете користити тимеит у командној линији. Ево еквивалента командне линије за позив функције тимеит:

$ python-m timeit -n [number] -s [setup] [stmt]
  • питхон -м тимеит представља да покрећемо тимеит као главни модул.
  • н је опција командне линије која означава колико пута код треба да се покрене. Ово је еквивалентно аргументу броја у позиву функције тимеит().
  • Можете користити опцију -с да дефинишете код за подешавање.

Овде преписујемо претходни пример користећи еквивалент командне линије:

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

У овом примеру израчунавамо време извршења уграђене функције лен(). Иницијализација стринга је код за подешавање који је прослеђен коришћењем опције с.

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

У излазу, приметите да добијамо време извршења за најбоље од 5 покретања. Шта ово значи? Када покренете тимеит на командној линији, опција понављања р је постављена на подразумевану вредност 5. То значи да се извршење стмт за наведени број пута понавља пет пута, а враћа се најбоље време извршења.

Анализа метода преокретања низова коришћењем тимеит

Када радите са Питхон стринговима, можда ћете желети да их обрнете. Два најчешћа приступа преокретању низова су следећа:

  • Коришћење сечења низова
  • Коришћење функције реверсед() и методе јоин().

Обрнути Питхон стрингови користећи сечење стрингова

Хајде да пређемо на то како функционише сечење стрингова и како га можете користити да обрнете Питхон стринг. Коришћење синтаксе соме-стринг[start:stop] враћа део стринга који почиње на почетку индекса и протеже се до стоп-1 индекса. Узмимо пример.

Размотрите следећи низ ‘Питхон’. Низ је дужине 6, а листа индекса је од 0, 1, 2 до 5.

>>> string_1 = 'Python'

Када наведете и почетну и граничну вредност, добијате исечак низа који се протеже од почетка до краја-1. Према томе, стринг_1[1:4] враћа ‘итх’.

  9 Хостинг говорног сервера за личне или пословне потребе [Teamspeak, Mumble, Lavalink]

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

Када не наведете почетну вредност, користи се подразумевана почетна вредност нула, а пресек почиње од индекса нула и протеже се до стоп – 1.

Овде је вредност заустављања 3, тако да исечак почиње са индексом 0 и иде до индекса 2.

>>> string_1[:3]
'Pyt'

Када не укључите индекс заустављања, видећете да исечак почиње од почетног индекса (1) и да се протеже до краја низа.

>>> string_1[1:]
'ython'

Занемаривање и почетне и граничне вредности враћа део целог стринга.

>>> string_1[::]
'Python'

Хајде да направимо исечак са вредношћу корака. Поставите вредности за почетак, заустављање и корак на 1, 5 и 2, респективно. Добијамо део стринга који почиње од 1 и протеже се до 4 (искључујући крајњу тачку 5) који садржи сваки други знак.

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

Када користите негативан корак, можете добити исечак који почиње на крају низа. Са кораком постављеним на -2, стринг_1[5:2:-2] даје следећи део:

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

Дакле, да бисмо добили обрнуту копију стринга, прескачемо почетне и стоп вредности и постављамо корак на -1, као што је приказано:

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

Укратко: стринг[::-1] враћа обрнуту копију стринга.

Обрнути низови помоћу уграђених функција и метода стрингова

Уграђена функција реверсед() у Питхон-у ће вратити обрнути итератор преко елемената стринга.

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

Дакле, можете проћи кроз обрнути итератор користећи фор петљу:

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

И приступите елементима низа обрнутим редоследом.

# Output
n
o
h
t
y
P

Затим можете позвати метод јоин() на обрнутом итератору са синтаксом: <сеп>.јоин(реверсед(соме-стринг)).

Исечак кода у наставку показује неколико примера где је сепаратор цртица и размак, респективно.

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

Овде не желимо никакав сепаратор; па поставите сепаратор на празан стринг да бисте добили обрнуту копију стринга:

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

Коришћење .јоин(реверсед(соме-стринг)) враћа обрнуту копију стринга.

Поређење времена извршења Коришћењем тимеит

До сада смо научили два приступа да преокренемо Питхон стрингове. Али који је од њих бржи? Хајде да сазнамо.

  8 најбољих ПЦ Бенцхмарк софтвера у 2022

У претходном примеру где смо темпирали једноставне Питхон изразе, нисмо имали никакав код за подешавање. Овде преокрећемо Питхон стринг. Док се операција преокретања низа изводи онолико пута колико је одређено бројем, код за подешавање је иницијализација стринга који ће се покренути само једном.

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

За исти број покретања за преокретање датог стринга, приступ сечења стрингова је бржи од коришћења методе јоин() и функције реверсед().

Временске Питхон функције Коришћење тимеит

У овом одељку, хајде да научимо како да меримо Питхон функције са тимеит функцијом. С обзиром на листу стрингова, следећа функција хасДигит враћа листу стрингова који имају најмање једну цифру.

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

Сада бисмо желели да измеримо време извршавања ове Питхон функције хасДигит() користећи тимеит.

Хајде да прво идентификујемо исказ који треба да буде временски (стмт). То је позив функције хасДигит() са листом стрингова као аргументом. Затим, хајде да дефинишемо код за подешавање. Можете ли да погодите који би код за подешавање требало да буде?

Да би се позив функције успешно покренуо, код за подешавање треба да садржи следеће:

  • Дефиниција функције хасДигит()
  • Иницијализација листе аргумената стрингова

Хајде да дефинишемо код за подешавање у низу за подешавање, као што је приказано у наставку:

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

Затим можемо користити функцију тимеит и добити време извршења функције хасДигит() за 100000 покретања.

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

Закључак

Научили сте како да користите Питхон-ову функцију тимеит за временске изразе, функције и друге позиве. Ово вам може помоћи да упоредите свој код, упоредите време извршавања различитих имплементација исте функције и још много тога.

Хајде да прегледамо шта смо научили у овом водичу. Можете користити функцију тимеит() са синтаксом тимеит.тимеит(стмт=…,сетуп=…,нумбер=…). Алтернативно, можете да покренете тимеит на командној линији да бисте темпирали кратке исечке кода.

Као следећи корак, можете истражити како да користите друге Питхон пакете за профилисање као што су лине-профилер и мемпрофилер за профилисање кода за време и меморију, респективно.

Затим научите како да израчунате временску разлику у Питхон-у.