Използване на Python Timeit за време на вашия код

В този урок ще научите как да използвате функцията timeit от модула timeit на Python. Ще научите как да определяте времето на прости изрази и функции в Python.

Времето на вашия код може да ви помогне да получите оценка на времето за изпълнение на част от кода и също така да идентифицирате секциите от кода, които трябва да бъдат оптимизирани.

Ще започнем с изучаването на синтаксиса на функцията timeit на Python. И след това ще кодираме примери, за да разберем как да го използваме за времеви блокове от код и функции във вашия Python модул. Нека да започнем.

Как да използвате функцията timeit на Python

Модулът timeit е част от стандартната библиотека на Python и можете да го импортирате:

import timeit

Синтаксисът за използване на функцията timeit от модула timeit е както е показано по-долу:

timeit.timeit(stmt, setup, number)

Тук:

  • stmt е частта от кода, чието време за изпълнение трябва да бъде измерено. Можете да го посочите като обикновен низ на Python или многоредов низ, или да подадете името на извиквания.
  • Както подсказва името, настройката обозначава частта от код, която трябва да се изпълни само веднъж, често като предпоставка за изпълнение на stmt. Да предположим например, че изчислявате времето за изпълнение за създаването на масив NumPy. В този случай импортирането на numpy е кодът за настройка, а действителното създаване е операторът, който трябва да бъде насрочен.
  • Номерът на параметъра обозначава броя пъти, в които stmt се изпълнява. Стойността по подразбиране на числото е 1 милион (1000000), но можете също да зададете този параметър на всяка друга стойност по ваш избор.

Сега, след като научихме синтаксиса за използване на функцията timeit(), нека започнем да кодираме някои примери.

Времеви прости изрази на Python

В този раздел ще се опитаме да измерим времето за изпълнение на прости изрази на Python с помощта на timeit.

Стартирайте Python REPL и изпълнете следните примери на код. Тук изчисляваме времето за изпълнение на операциите за степенуване и деление на пода за 10 000 и 100 000 изпълнения.

  Използвайте Vimium, за да сърфирате с клавиатурата в Chrome и Firefox

Забележете, че предаваме оператора, който да бъде синхронизиран като низ на Python, и използваме точка и запетая, за да разделим различните изрази в оператора.

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

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

Стартиране на Python timeit в командния ред

Можете също да използвате timeit в командния ред. Ето еквивалента на командния ред на извикването на функцията timeit:

$ python-m timeit -n [number] -s [setup] [stmt]
  • python -m timeit означава, че изпълняваме timeit като основен модул.
  • n е опция на командния ред, която обозначава колко пъти трябва да се изпълни кодът. Това е еквивалентно на числовия аргумент в извикването на функцията timeit().
  • Можете да използвате опцията -s, за да дефинирате кода за настройка.

Тук пренаписваме предишния пример, като използваме еквивалента на командния ред:

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

В този пример ние изчисляваме времето за изпълнение на вградената функция len(). Инициализирането на низа е кодът за настройка, който се предава с помощта на опцията s.

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

В изхода забележете, че получаваме времето за изпълнение за най-доброто от 5 изпълнения. Какво означава това? Когато стартирате timeit в командния ред, опцията за повторение r е зададена на стойността по подразбиране 5. Това означава, че изпълнението на stmt за посочения брой пъти се повтаря пет пъти и се връща най-доброто от времето за изпълнение.

Анализ на методите за обръщане на низове с помощта на timeit

Когато работите с низове на Python, може да искате да ги обърнете. Двата най-често срещани подхода за обръщане на низ са както следва:

  • Използване на нарязване на низове
  • Използване на функцията reversed() и метода join().

Обратни низове на Python с помощта на нарязване на низове

Нека да разгледаме как работи нарязването на низове и как можете да го използвате, за да обърнете низ на Python. Използване на синтаксиса some-string[start:stop] връща част от низа, започвайки от началото на индекса и продължавайки до индекс stop-1. Да вземем пример.

Помислете за следния низ „Python“. Низът е с дължина 6, а списъкът с индекси е от 0, 1, 2 до 5.

>>> string_1 = 'Python'

Когато посочите както началната, така и крайната стойност, получавате отрязък от низ, който се простира от начало до стоп-1. Следователно, низ_1[1:4] връща ‘yth’.

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

Когато не посочите началната стойност, се използва началната стойност по подразбиране от нула и срезът започва от индекс нула и се простира до край – 1.

  10 най-добри софтуера за конфигуриране на ценова оферта (CPQ) през 2022 г

Тук стойността на спиране е 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, string_1[5:2:-2] дава следния дял:

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

Така че, за да получим обърнато копие на низа, пропускаме началните и крайните стойности и задаваме стъпката на -1, както е показано:

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

Накратко: низ[::-1] връща обърнато копие на низа.

Обръщане на низове с помощта на вградени функции и методи на низове

Вградената функция reversed() в Python ще върне обратен итератор върху елементите на низа.

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

Така че можете да преминете през обратния итератор, като използвате for цикъл:

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

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

# Output
n
o
h
t
y
P

След това можете да извикате метода join() на обратния итератор със синтаксиса: .join(reversed(some-string)).

Кодовият фрагмент по-долу показва няколко примера, при които разделителят е съответно тире и интервал.

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

Тук не искаме никакъв разделител; така че задайте разделителя на празен низ, за ​​да получите обърнато копие на низа:

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

Използването на .join(reversed(some-string)) връща обърнато копие на низа.

Сравняване на времето за изпълнение с помощта на timeit

Досега сме научили два подхода за обръщане на низове на Python. Но кой от тях е по-бърз? Нека разберем.

В предишен пример, в който времевихме прости изрази на Python, нямахме никакъв код за настройка. Тук обръщаме низа на Python. Докато операцията за обръщане на низ се изпълнява за броя пъти, определен от числото, кодът за настройка е инициализацията на низа, който ще се изпълни само веднъж.

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

За същия брой изпълнения за обръщане на даден низ, подходът за нарязване на низ е по-бърз от използването на метода join() и функцията reversed().

  Как да редактирате GIF файлове на iPhone

Времеви функции на Python Използване на timeit

В този раздел нека научим как да измерваме времето на функциите на Python с функцията timeit. При даден списък от низове, следната функция hasDigit връща списъка от низове, които имат поне една цифра.

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

Сега бихме искали да измерим времето за изпълнение на тази функция на Python hasDigit() с помощта на timeit.

Нека първо да идентифицираме израза, който трябва да бъде синхронизиран (stmt). Това е извикването на функцията hasDigit() със списък от низове като аргумент. След това нека дефинираме кода за настройка. Можете ли да познаете какъв трябва да бъде кодът за настройка?

За да се изпълни успешно извикването на функцията, кодът за настройка трябва да включва следното:

  • Дефиницията на функцията hasDigit()
  • Инициализацията на списъка с аргументи от низове

Нека дефинираме кода за настройка в низа за настройка, както е показано по-долу:

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

След това можем да използваме функцията timeit и да получим времето за изпълнение на функцията hasDigit() за 100 000 изпълнения.

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

Заключение

Научихте как да използвате функцията timeit на Python за време на изрази, функции и други извикваеми. Това може да ви помогне да сравните вашия код, да сравните времената за изпълнение на различни реализации на една и съща функция и др.

Нека прегледаме какво сме научили в този урок. Можете да използвате функцията timeit() със синтаксиса timeit.timeit(stmt=…,setup=…,number=…). Като алтернатива можете да изпълните timeit в командния ред, за да засечете кратки кодови фрагменти.

Като следваща стъпка можете да проучите как да използвате други пакети за профилиране на Python като line-profiler и memprofiler, за да профилирате кода си съответно за време и памет.

След това научете как да изчислявате часовата разлика в Python.

x