Разное

Время выполнения программы python: Как измерить время выполнения скрипта Python

Как измерить время выполнения скрипта Python

Допустим, вы хотите знать время выполнения следующего кода Python:

a = range(100000) 
b = [] 
for i in a:     
    b.append(i*2)

Есть несколько способов измерить время, необходимое для выполнения скрипта Python, но вот лучший способ сделать это, и я объясню почему:

import timeit

code_to_test = """
a = range(100000)
b = []
for i in a:
    b.append(i*2)
"""

elapsed_time = timeit.timeit(code_to_test, number=100)/100
print(elapsed_time)

В консоли получим: 0.01137321546

Это вывод, который я получаю на своем Macbook Pro. Итак, это более или менее 1/100 секунды.

Как работает вышеуказанный скрипт

Строка 1: мы импортируем модуль timeit. Строка 3: мы создаем переменную. В этой переменной мы храним код, который хотим протестировать. Этот код должен идти внутри тройных кавычек. Итак, тестовый код предоставляется в виде строки. Строка 10: мы вызываем функцию time.timeit(). Функция timeit() получает тестовый код в качестве аргумента, выполняет его и записывает время выполнения. Чтобы получить точное время, я приказал timeit() выполнить 100 циклов. Поэтому мне пришлось разделить вывод на 100, чтобы получить время выполнения только для одного цикла. Строка 11: мы просто распечатываем время выполнения. Результат — время выполнения в секундах.

Почему timeit() — лучший способ измерить время выполнения кода Python?

1. timeit() автоматически будет использовать time.clock() или time.time() для вас в фоновом режиме, в зависимости от того, какая операционная система вам нужна для получения наиболее точных результатов.

2.  timeit() отключает сборщик мусора, который может исказить результаты.

3. timeit() повторяет тест много раз (в нашем случае 100 раз), чтобы минимизировать влияние других задач, выполняемых в вашей операционной системе.

Упражнение:

Кстати, код, который мы тестировали выше, строит список путем умножения элементов другого списка. Я могу достичь того же результата, используя range:

a = range(100000)
b = [i*2 for i in a] 

Если вам больше нечем заняться и попробуйте выполнить упражнение, попробуйте измерить время выполнения приведенного выше кода с помощью timeit().

Наконец, совет:  закрывайте тяжелые программы, которые запускаются на вашем компьютере, когда вы выполняете такие тесты, чтобы вы получили еще более точные результаты, которые не зависят от тяжелых задач процессора.

Отслеживаем прогресс выполнения в Python / Хабр

Индикаторы прогресса (progress bar) — визуальное отображение процесса работы. Они избавляют нас от необходимости беспокоиться о том, не завис ли скрипт, дают интуитивное представление о скорости его выполнения и подсказывают, сколько времени осталось до завершения.

Человек ранее не использовавший индикаторы прогресса может предположить, что их внедрение может сильно усложнить код. К счастью, это не так. Небольшие примеры ниже покажут, как быстро и просто начать отслеживать прогресс в консоли или в интерфейсе быстро набирающей популярность графической библиотеки PySimpleGUI.

Первым у нас идёт модуль Progress.

Всё, что от вас потребуется, это указать количество ожидаемых итераций, тип индикатора и вызывать функцию при каждой итерации:

import time
from progress.bar import IncrementalBar

mylist = [1,2,3,4,5,6,7,8]

bar = IncrementalBar('Countdown', max = len(mylist))

for item in mylist:
    bar.next()
    time.sleep(1)

bar.finish()

Результат работы:

Есть индикаторы на любой вкус:

Следующей на очереди идёт библиотека tqdm.

Быстрый и расширяемый индикатор прогресса для Python и CLI

Всего один вызов функции понадобится для получения результата аналогичного предыдущему:

import time
from tqdm import tqdm

mylist = [1,2,3,4,5,6,7,8]

for i in tqdm(mylist):
    time.sleep(1)

Получаем:

Само собой, в комплекте идёт куча настроек и опций.

Ещё один вариант синтаксиса, побольше дефолтных анимаций, чем в предыдущих примерах:

from alive_progress import alive_bar
import time

mylist = [1,2,3,4,5,6,7,8]

with alive_bar(len(mylist)) as bar:
    for i in mylist:
        bar()
        time.sleep(1)

Результат:

Иногда возникает необходимость предоставить конечному пользователю графический индикатор.

Сколько кода нужно, чтобы достигнуть такого результата? Немного:

import PySimpleGUI as sg
import time

mylist = [1,2,3,4,5,6,7,8]

for i, item in enumerate(mylist):
    sg.one_line_progress_meter('This is my progress meter!', i+1, len(mylist), '-key-')
    time.sleep(1)

Рассмотрим реализацию индикатора в PySimpleGUI.

Вот как это сделать:

import PySimpleGUI as sg
import time

mylist = [1,2,3,4,5,6,7,8]

progressbar = [
    [sg.ProgressBar(len(mylist), orientation='h', size=(51, 10), key='progressbar')]
]
outputwin = [
    [sg.Output(size=(78,20))]
]

layout = [
    [sg.Frame('Progress',layout= progressbar)],
    [sg.Frame('Output', layout = outputwin)],
    [sg.Submit('Start'),sg.Cancel()]
]

window = sg.Window('Custom Progress Meter', layout)
progress_bar = window['progressbar']

while True:
    event, values = window.read(timeout=10)
    if event == 'Cancel'  or event is None:
        break
    elif event == 'Start':
        for i,item in enumerate(mylist):
            print(item)
            time.sleep(1)
            progress_bar.UpdateBar(i + 1)

window.close()

Как видите, нет ничего сложного в добавлении информации о прогрессе выполнения: кода немного, а отзывчивость повышается очень сильно. Используйте индикаторы, чтобы больше никогда не гадать, завис ли процесс или нет!

python timeit, функция для подсчета времени выполнения

В python timeit используется для того, чтобы выяснить время выполнения скрипта или определенного участка кода. Код выполняется несколько раз, возвращается самый лучший результат.

 

 

 

Функция timeit обычно нужна для отладки скриптов, в том числе тогда когда используются обрабатывающиеся медленно регулярные выражения.

 

Рассмотрим более простой пример.

mcedit hello.py

#!/usr/bin/python3


def hello(a):
    b = a * 2 
    print (b)


if __name__=='__main__':
    from timeit import Timer
    t = Timer(lambda: hello(10))
    print (t.timeit(number=14))


 

Здесь функция hello с одник передаваемым ей аргументом — это тестируемый код.

В функции main определяется, что hello требуется выполнять передавая значение аргумента 10. Выполнение требуется 14 раз.

 

Запускаем скрипт:

 

python3 hello.py

20
20
20
20
20
20
20
20
20
20
20
20
20
20
0.0001920969998536748

 

Поскольку код максимально упрощен какого-либо разброса не получилось, однако есть финальный результат — усредненное время выполнение.

 

 

Выполнение кода несколько раз требуется для того чтобы минимизировать возможность влияния случайных процессов. Они всегда существуют в системе, при большом количестве тестов получается результат со средней погрешностью.

 

Принцип для реальных скриптов остается тем же, меняется в общем случае только сама функция, которая требуется проверять.

 

 

Можно выполнять скрипты и через Linux утилиту time:

#!/usr/bin/python3

import os

os.system("time python3 hello.py")

 

Можно вызывать не однократное исполнение, запуск в цикле for.

 

Для той же цели подойдет и модуль subprocess. Он позволяет получать информацию в более удобной для дальнейшей обработки форме.

Timeit в Python с примерами

Эта статья познакомит вас с методом измерения времени выполнения ваших фрагментов кода Python.
Мы будем использовать встроенную библиотеку Python timeit .

Этот модуль предоставляет простой способ найти время выполнения маленьких битов кода Python.

Почему время?

  • Ну, а как насчет использования простого модуля времени? Просто сэкономьте время до и после выполнения кода и вычтите их! Но этот метод не является точным, поскольку может быть запущен фоновый процесс, который прерывает выполнение кода, и вы получите значительные изменения во времени выполнения небольших фрагментов кода.
  • timeit запускает ваш фрагмент кода миллионы раз (значение по умолчанию — 1000000), так что вы получите наиболее статистически значимое измерение времени выполнения кода!
  • TimeIt довольно прост в использовании и имеет интерфейс командной строки, а также вызываемый.

Итак, теперь давайте начнем исследовать эту удобную библиотеку!

Функция модуля timeit.timeit (stmt, setup, timer, number) принимает четыре аргумента:

  • stmt — это утверждение, которое вы хотите измерить; по умолчанию это «пройти».
  • setup, который является кодом, который вы запускаете перед запуском stmt ; по умолчанию это «пройти».
    Обычно мы используем это для импорта необходимых модулей для нашего кода.
  • таймер, который является объектом timeit.Timer ; обычно оно имеет разумное значение по умолчанию, поэтому вам не нужно об этом беспокоиться.
  • число, которое является числом выполнений, которые вы хотели бы запустить stmt .

Где функция timeit.timeit () возвращает количество секунд, которое потребовалось для выполнения кода.

Пример 1

Давайте сначала посмотрим на основной пример.

import timeit

  

mysetup = "from math import sqrt"

  

mycode =

    

    

        

  

print timeit.timeit(setup = mysetup,

                    stmt = mycode,

                    number = 10000)

  • Результатом вышеприведенной программы будет время выполнения (в секундах) для 10000 итераций фрагмента кода, переданного функции timeit.timeit () .

    Примечание: Обратите внимание на то , что выход является время выполнения итерации число раз фрагмента кода, а не одну итерацию. Для одной итерации exec. время, разделите время выхода на число .

  • Программа довольно проста. Все, что нам нужно сделать, это передать код в виде строки в функцию timeit.timeit () .
  • Рекомендуется сохранять операторы импорта и другие статические фрагменты кода в аргументе настройки.

Пример 2

Давайте посмотрим на другой практический пример, в котором мы сравним два метода поиска, а именно: бинарный поиск и линейный поиск .
Кроме того, здесь я продемонстрирую еще две возможности : функцию timeit.repeat и вызов функций, уже определенных в нашей программе.

import timeit

  

def binary_search(mylist, find):

    while len(mylist) > 0:

        mid = (len(mylist))//2

        if mylist[mid] == find:

            return True

        elif mylist[mid] < find:

            mylist = mylist[:mid]

        else:

            mylist = mylist[mid + 1:]

    return False

  

  

def linear_search(mylist, find):

    for x in mylist:

        if x == find:

            return True

    return False

  

  

def binary_time():

    SETUP_CODE =

  

    TEST_CODE =

      

    

    times = timeit.repeat(setup = SETUP_CODE,

                          stmt = TEST_CODE,

                          repeat = 3,

                          number = 10000)

  

    

    print('Binary search time: {}'.format(min(times)))        

  

  

def linear_time():

    SETUP_CODE =

      

    TEST_CODE =

    

    

    times = timeit.repeat(setup = SETUP_CODE,

                          stmt = TEST_CODE,

                          repeat = 3,

                          number = 10000)

  

    

    print('Linear search time: {}'.format(min(times)))  

  

if __name__ == "__main__":

    linear_time()

    binary_time()

  • Вывод вышеуказанной программы будет минимальным значением в списке раз .
    Вот как выглядит пример вывода:
  • Функция timeit.repeat () принимает один дополнительный аргумент, repeat . Выводом будет список времени выполнения всех запусков кода, повторенных с указанным номером. раз.
  • В аргументе настройки мы передали:
    from __main__ import binary_search
    from random import randint

    Это импортирует определение функции binary_search , уже определенной в программе, и случайную библиотечную функцию randint .

  • Как и ожидалось, мы заметили, что время выполнения бинарного поиска значительно меньше, чем линейного поиска!

Пример 3
Наконец, ниже я продемонстрирую, как вы можете использовать интерфейс командной строки модуля timeit :

Здесь я объясняю каждый термин в отдельности:

Итак, это было краткое, но краткое введение в модуль timeit и его практическое применение.
Это очень удобный инструмент для программистов на Python, когда им требуется быстрый взгляд на время выполнения их фрагментов кода.

Эта статья предоставлена Нихилом Кумаром . Если вам нравится GeeksforGeeks и вы хотели бы внести свой вклад, вы также можете написать статью, используя contrib.geeksforgeeks.org, или отправить свою статью на электронный адрес [email protected] Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Timeit в Python с примерами

0.00 (0%) 0 votes

Как получить время выполнения программы Python? — python

У меня есть программа командной строки в Python, которая занимает некоторое время, чтобы закончить. Я хочу знать точное время, необходимое для того, чтобы закончить бег.

Я посмотрел на модуль timeit , но, похоже, это только для небольших фрагментов кода. Я хочу засечь время всей программы.

python

time

Поделиться

Источник


john2x    

12 октября 2009 в 23:56

25 Ответов



1275

Самый простой способ в Python:

import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))

Это предполагает, что ваша программа занимает не менее десятой доли секунды для запуска.

Печать:

--- 0.764891862869 seconds ---

Поделиться


rogeriopvl    

13 октября 2009 в 00:00



185

Я помещаю этот модуль timing.py в свой собственный каталог site-packages и просто вставляю import timing в верхней части моего модуля:

import atexit
from time import clock

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print line
    print secondsToStr(clock()), '-', s
    if elapsed:
        print "Elapsed time:", elapsed
    print line
    print

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

start = clock()
atexit.register(endlog)
log("Start Program")

Я также могу вызвать timing.log из своей программы, если в программе есть важные этапы, которые я хочу показать. Но только включение import timing выведет начальное и конечное время, а также общее затраченное время. (Простите мою непонятную функцию secondsToStr , она просто форматирует число секунд с плавающей запятой в форму hh:mm:ss.sss.)

Примечание: версию Python 3 вышеуказанного кода можно найти здесь или здесь .

Поделиться


PaulMcG    

13 октября 2009 в 02:08


Поделиться


steveha    

12 октября 2009 в 23:59



57

import time

start_time = time.clock()
main()
print time.clock() - start_time, "seconds"

time.clock() возвращает процессорное время, что позволяет нам вычислить только время, используемое этим процессом (по крайней мере, на Unix). В документации говорится: «в любом случае, эта функция используется для бенчмаркинга Python или алгоритмов синхронизации»

Поделиться


newacct    

13 октября 2009 в 01:25



54

Мне очень нравится ответ Paul McGuire, но я использую Python3. Итак, для тех, кто заинтересован: вот модификация его ответа, которая работает с Python 3 на *nix (я предполагаю, что под Windows следует использовать clock() вместо time()):

#python3
import atexit
from time import time, strftime, localtime
from datetime import timedelta

def secondsToStr(elapsed=None):
    if elapsed is None:
        return strftime("%Y-%m-%d %H:%M:%S", localtime())
    else:
        return str(timedelta(seconds=elapsed))

def log(s, elapsed=None):
    line = "="*40
    print(line)
    print(secondsToStr(), '-', s)
    if elapsed:
        print("Elapsed time:", elapsed)
    print(line)
    print()

def endlog():
    end = time()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

start = time()
atexit.register(endlog)
log("Start Program")

Если вы находите это полезным, вы все равно должны проголосовать за его ответ вместо этого, так как он сделал большую часть работы ;).

Поделиться


Nicojo    

10 сентября 2012 в 02:03



44

Вы можете использовать профилировщик python cProfile для измерения времени CPU и дополнительно того, сколько времени тратится внутри каждой функции и сколько раз вызывается каждая функция. Это очень полезно, если вы хотите улучшить производительность вашего скрипта, не зная, с чего начать. Этот ответ на другой вопрос SO довольно хорош. Всегда полезно заглянуть и в документы .

Вот пример того, как профилировать скрипт с помощью cProfile из командной строки:

$ python -m cProfile euler048.py

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}

Поделиться


jacwah    

02 января 2014 в 00:35



35

Мне нравится вывод, который предоставляет модуль datetime , где объекты временной дельты показывают дни, часы, минуты и т. д. по мере необходимости в удобочитаемом для человека виде.

Например:

from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))

Пример вывода например

Duration: 0:00:08.309267

или

Duration: 1 day, 1:51:24.269711

Обновление: As J.F. Себастьян упомянул, что этот подход может столкнуться с некоторыми сложными случаями с местным временем, поэтому его безопаснее использовать:

import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))

Поделиться


metakermit    

29 сентября 2014 в 11:55



24

Еще лучше для Linux: /usr/bin/time

$ /usr/bin/time -v python rhtest2.py

    Command being timed: "python rhtest2.py"
    User time (seconds): 4.13
    System time (seconds): 0.07
    Percent of CPU this job got: 91%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 0
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 15
    Minor (reclaiming a frame) page faults: 5095
    Voluntary context switches: 27
    Involuntary context switches: 279
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Обычно просто time -это более простая shell постройка, которая затеняет более способную /usr/bin/time .

Поделиться


u0b34a0f6ae    

13 октября 2009 в 06:10



12

Решение rogeriopvl работает отлично, но если вы хотите получить более конкретную информацию, вы можете использовать встроенный профилировщик python. Проверять эту страницу:

http://docs.python.org/library/profile.html

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

Поделиться


wezzy    

13 октября 2009 в 00:07



11

Следующий фрагмент печатает прошедшее время в удобном для восприятия человеком формате <HH:MM:SS> .

import time
from datetime import timedelta

start_time = time.time()

#
# Perform lots of computations.
#

elapsed_time_secs = time.time() - start_time

msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))

print(msg)    

Поделиться


Sandeep    

01 июля 2016 в 22:24



10

time.clock()

Устарело с версии 3.3: поведение этой функции зависит от
на платформе: вместо этого используйте perf_counter() или process_time() ,
в зависимости от ваших требований, иметь четко определенное поведение.

time.perf_counter()

Возвращает значение (в долях секунды) счетчика производительности,
т. е. часы с самым высоким доступным разрешением для измерения короткого
продолжительность. Она включает в себя время, прошедшее во время сна и является
общесистемный.

time.process_time()

Возвращает значение (в дробных секундах) суммы системы и
пользователь CPU время текущего процесса. Он не включает в себя прошедшее время
во время сна.

start = time.process_time()
... do something
elapsed = (time.process_time() - start)

Поделиться


Yas    

18 мая 2016 в 03:49



8

from time import time
start_time = time()
...
end_time = time()
time_taken = end_time - start_time # time_taken is in seconds
hours, rest = divmod(time_taken,3600)
minutes, seconds = divmod(rest, 60)

Поделиться


Qina Yan    

06 апреля 2016 в 07:45



8

Просто используйте модуль timeit . Он работает как с Python 2, так и с Python 3

import timeit

start = timeit.default_timer()
#ALL THE PROGRAM STATEMETNS
stop = timeit.default_timer()
execution_time = stop - start

print("Program Executed in "+execution_time) #It returns time in sec

Он возвращается в считанные секунды, и Вы можете иметь свое время выполнения. Просто, но вы должны написать их в главной функции, которая запускает выполнение программы. Если вы хотите получить время выполнения даже тогда, когда вы получаете ошибку, то возьмите свой параметр «Start» к нему и вычислите там, как

def sample_function(start,**kwargs):
     try:
         #your statements
     Except:
         #Except Statements
         stop = timeit.default_timer()
         execution_time = stop - start
         print("Program Executed in "+execution_time)

Поделиться


Ravi Kumar    

18 сентября 2017 в 19:08



7

Ipython «timeit» любой сценарий:

def foo():
    %run bar.py
timeit foo()

Поделиться


B.Kocis    

20 мая 2015 в 14:40


Поделиться


jfs    

03 марта 2015 в 09:04



5

Существует модуль timeit , который может быть использован для определения времени выполнения кодов python.
Он имеет подробную документацию и примеры в python docs (https://docs.python.org/2/library/timeit.html )

Поделиться


Alfie    

20 октября 2014 в 14:55



5

Мне тоже понравился ответ Paul McGuire, и я придумал форму контекстного менеджера, которая больше соответствовала моим потребностям.

import datetime as dt
import timeit

class TimingManager(object):
    """Context Manager used with the statement 'with' to time some execution.

    Example:

    with TimingManager() as t:
       # Code to time
    """

    clock = timeit.default_timer

    def __enter__(self):
        """
        """
        self.start = self.clock()
        self.log('\n=> Start Timing: {}')

        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        """
        self.endlog()

        return False

    def log(self, s, elapsed=None):
        """Log current time and elapsed time if present.
        :param s: Text to display, use '{}' to format the text with
            the current time.
        :param elapsed: Elapsed time to display. Dafault: None, no display.
        """
        print s.format(self._secondsToStr(self.clock()))

        if(elapsed is not None):
            print 'Elapsed time: {}\n'.format(elapsed)

    def endlog(self):
        """Log time for the end of execution with elapsed time.
        """
        self.log('=> End Timing: {}', self.now())

    def now(self):
        """Return current elapsed time as hh:mm:ss string.
        :return: String.
        """
        return str(dt.timedelta(seconds = self.clock() - self.start))

    def _secondsToStr(self, sec):
        """Convert timestamp to h:mm:ss string.
        :param sec: Timestamp.
        """
        return str(dt.datetime.fromtimestamp(sec))

Поделиться


Gall    

29 января 2015 в 15:42



4

Используйте line_profiler .

line_profiler будет профилировать время выполнения отдельных строк кода. Профилировщик реализован в C через Cython, чтобы уменьшить накладные расходы на профилирование.

from line_profiler import LineProfiler
import random

def do_stuff(numbers):
    s = sum(numbers)
    l = [numbers[i]/43 for i in range(len(numbers))]
    m = ['hello'+str(numbers[i]) for i in range(len(numbers))]

numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler()
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)
lp.print_stats()

Результаты будут такими:

Timer unit: 1e-06 s

Total time: 0.000649 s
File: <ipython-input-2-2e060b054fea>
Function: do_stuff at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           def do_stuff(numbers):
     5         1           10     10.0      1.5      s = sum(numbers)
     6         1          186    186.0     28.7      l = [numbers[i]/43 for i in range(len(numbers))]
     7         1          453    453.0     69.8      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]

Поделиться


Yu Jiaao    

28 марта 2018 в 05:43



3

Для людей с данными использующих блокноты Jupyter

В ячейке вы можете использовать магическую команду %%time Jupyter для измерения времени выполнения:

%%time 
[ x**2 for x in range(10000)] 

Выход

CPU раз: пользователь 4.54 МС, sys: 0 ns, всего: 4.54 МС

Время стены: 4.12 МС

Это позволит захватить только время выполнения конкретной ячейки. Если вы хотите записать время выполнения всей записной книжки (т. е. программы), вы можете создать новую записную книжку в том же каталоге и в новой записной книжке выполнить все ячейки:

Предположим, что записная книжка выше называется example_notebook.ipynb . В новой записной книжке в том же каталоге :

# Convert your notebook to a .py script:
!jupyter nbconvert --to script example_notebook.ipynb

# Run the example_notebook with -t flag for time
%run -t example_notebook

Выход

IPython CPU тайминги (расчетные):
Пользователь: 0.00 s.

Система : 0.00 С.

Настенное время: 0.00 С.

Поделиться


Matt    

28 июля 2018 в 16:48



2

Это ответ пола McGuire, который работает для меня. Просто на случай, если у кого-то возникнут проблемы с управлением этой машиной.

import atexit
from time import clock

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print (line)
    print (secondsToStr(clock()), '-', s)
    if elapsed:
        print ("Elapsed time:", elapsed)
    print (line)

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

def main():
    start = clock()
    atexit.register(endlog)
    log("Start Program")

вызовите timing.main() из вашей программы после импорта файла.

Поделиться


Saurabh Rana    

08 апреля 2015 в 00:24



2

Timeit-это класс в python, используемый для вычисления времени выполнения небольших блоков кода.

Default_timer-это метод в этом классе, который используется для измерения времени настенных часов, а не времени выполнения CPU. Таким образом, выполнение другого процесса может помешать этому. Таким образом, он полезен для небольших блоков кода.

Пример кода выглядит следующим образом:

from timeit import default_timer as timer

start= timer()

#some logic 

end = timer() 

print("Time taken:", end-start) 

Поделиться


Utkarsh Dhawan    

16 ноября 2017 в 02:16



2

Я использовал очень простую функцию для синхронизации части выполнения кода:

import time
def timing():
    start_time = time.time()
    return lambda x: print("[{:.2f}s] {}".format(time.time() - start_time, x))

И чтобы использовать его, просто вызовите его перед кодом для измерения, чтобы получить функцию синхронизации, затем вызовите функцию после кода с комментариями, и время появится перед комментариями, например:

t = timing()
train = pd.read_csv('train.csv',
                        dtype={
                            'id': str,
                            'vendor_id': str,
                            'pickup_datetime': str,
                            'dropoff_datetime': str,
                            'passenger_count': int,
                            'pickup_longitude': np.float64,
                            'pickup_latitude': np.float64,
                            'dropoff_longitude': np.float64,
                            'dropoff_latitude': np.float64,
                            'store_and_fwd_flag': str,
                            'trip_duration': int,
                        },
                        parse_dates = ['pickup_datetime', 'dropoff_datetime'],
                   )
t("Loaded {} rows data from 'train'".format(len(train)))

Тогда вывод будет выглядеть так:

[9.35s] Loaded 1458644 rows data from 'train'

Я чувствую себя немного элегантным таким образом.

Поделиться


Tao Wang    

07 августа 2018 в 05:42



1

Для использования обновленного ответа metakermit для python 2.7 вам потребуется монотонный пакет.

Тогда код будет выглядеть следующим образом:

from datetime import timedelta
from monotonic import monotonic

start_time = monotonic()
end_time = monotonic()
print(timedelta(seconds=end_time - start_time))

Поделиться


H0R5E    

16 июня 2017 в 13:18



0

Время выполнения программы Python может быть несогласованным в зависимости от:

  • Одна и та же программа может быть оценена с использованием различных алгоритмов
  • Время выполнения зависит от алгоритмов
  • Время выполнения варьируется между реализациями
  • Время выполнения варьируется между компьютерами
  • Время выполнения не предсказуемо на основе небольших входных данных

Это потому, что самый эффективный способ-использовать «Order of Growth» и выучить большую нотацию «O», чтобы сделать это правильно, https://en.wikipedia.org/wiki/Big_O_notation

В любом случае вы можете попробовать оценить производительность любой программы Python в конкретной машине, считая шаги в секунду, используя этот простой алгоритм:
адаптируйте это к программе, которую вы хотите оценить

import time

now = time.time()
future = now + 10
step = 4 # why 4 steps? because until here already 4 operations executed
while time.time() < future:
    step += 3 # why 3 again? because while loop execute 1 comparison and 1 plus equal statement
step += 4 # why 3 more? because 1 comparison starting while when time is over plus final assignment of step + 1 and print statement
print(str(int(step / 10)) + " steps per second")

Надеюсь, это поможет вам.

Поделиться


Manu    

31 июля 2017 в 15:13



0

Если вы хотите измерить время в микросекундах, то можете использовать следующую версию, полностью основанную на ответах Paul McGuire и Nicojo — это код Python3. Я также добавил к нему немного цвета:

import atexit
from time import time
from datetime import timedelta, datetime


def seconds_to_str(elapsed=None):
    if elapsed is None:
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    else:
        return str(timedelta(seconds=elapsed))


def log(txt, elapsed=None):
    colour_cyan = '\033[36m'
    colour_reset = '\033[0;0;39m'
    colour_red = '\033[31m'
    print('\n ' + colour_cyan + '  [TIMING]> [' + seconds_to_str() + '] ----> ' + txt + '\n' + colour_reset)
    if elapsed:
        print("\n " + colour_red + " [TIMING]> Elapsed time ==> " + elapsed + "\n" + colour_reset)


def end_log():
    end = time()
    elapsed = end-start
    log("End Program", seconds_to_str(elapsed))


start = time()
atexit.register(end_log)
log("Start Program")

log() = > функция, которая выводит информацию о времени.

txt ==> первый аргумент для регистрации, и это строка для обозначения времени.

atexit ==> python модуль для регистрации функций, которые можно вызывать при выходе из программы.

Поделиться


Rui Carvalho    

20 декабря 2018 в 00:36


Похожие вопросы:

Время выполнения внешней программы, вывод которой обрабатывается параметром Python

Я хочу измерить время выполнения внешней программы, вывод которой используется моим скриптом Python. Вызывая extprogram программу, которая произвела вывод, на данный момент я делаю что-то вроде:…

Как получить время работы программы в Haskell

Как я могу получить время работы программы через функции системного времени в Haskell? Я хотел бы измерить время выполнения всей программы и / или отдельной функции.

как получить время выполнения программы в linux terminal отдельно

Я хочу получить время выполнения программы в моем terminal. Я знаю, что я должен использовать эту команду: time chmod +x ~/example но выход такой: real 0m0.088s user 0m0.057s sys 0m0.030s Но я хочу…

Как получить время выполнения кода?

Я хочу рассчитать время выполнения кода различных языков, таких как java, python, javascript. Как получить время выполнения этих кодов. Есть ли какой-либо инструмент, доступный в пакетах python или…

Как получить время выполнения программы c?

Я использую функцию clock для моей программы c, чтобы напечатать время выполнения текущей программы. Я получаю неправильное время на выходе. Я хочу отображать время в секундах, миллисекундах и…

Время выполнения программы

Есть ли программное обеспечение / веб-сайт, где я могу отправить свои коды C, C++ и Java и получить статистику, такую как время выполнения программы, используемая память ? Мне интересно провести…

Как вы рассчитываете время выполнения программы в python?

Как вы рассчитываете время выполнения программы в python?

Вычислить время выполнения программы

У меня есть программа в C, которая должна выполнить ряд других программ. Мне нужно получить время выполнения каждой из этих программ, чтобы создать журнал этих времен. Я хотя и использую system()…

Просмотр списков генерации во время выполнения программы

история : Во время выступления Нины Захаренко PyCon об управлении памятью в Python она объясняет, как работает сбор мусора поколений в Python, отмечая, что: Python поддерживает список всех объектов,…

Получить время выполнения скрипта Python с помощью программы C

Мне нужно получить время выполнения скрипта Python со 100 различными входными значениями, поэтому я написал следующую программу C #include <stdlib.h> #include <stdio.h> int main(void) {…

Работа со временем в Python

При создании программ, периодически приходится работать с датой и временем. В Python работа с датой и временем начинается с импорта модуля time и использования функций из данного модуля.

Базовым термином при работе со временем в Python является термин tick — тик. Данный термин означает количество секунд прошедших с 12:00 1 января 1970. Эта дата по другому называется — эпоха. Временные интервалы представлены количеством секунд (число с плавающей точкой), прошедших с начала данной эпохи.


Модуль Python time позволяет манипулировать датой и временем.
Функция time.time() возвращает текущее время системы в тиках начиная с эпохи.

Пример:




# импорт модуля

import time

sec = time.time()

print( 'Количество секунд прошедших с 12:00 1 Января 1970 составляет ' + sec  )


С данным представлением времени в тиках очень легко и удобно производить различные арифметические операции. Но, учтите что диапазон дат, которыми можно манипулировать с помощью данного модуля ограничен снизу 1970, и сверху 2038 годами. Т.е. даты раньше и позже представлены быть не могут с помощью данного модуля.

Следующей базовой компонентой работы с датой и временем в Python является так называемый «кортеж времени — TimeTuple». О кортежах я уже рассказывал, кратко напомню, что это просто нередактируемые списки.

Итак, TimeTuple — это на самом деле класс time.struct_time, который расширяет встроенный в Python класс tuple. Если вы уже
знакомы с PHP или Java, то такие термины как класс и наследование должны быть вам знакомы. И так как Python
мультипарадигменный язык в нем присутствуют классы и ООП, но об этом уже в другой статье. Состав объекта TimeTuple:




Индекс  Поле класса      Атрибут          Пример значения

0       год - 4 цифры    tm_year          2019

1       Число месяца     tm_mon           [1,12]

2       День             tm_mday          [1,31]

3       Час              tm_hour          [0,23]

4       Минута           tm_min           [0,59]

5       Секунды          tm_sec           [0,61] (60 или 61 - это секунда координации)

6       День недели      tm_wday          [0,6]  (0 - понедельник, но это поведение можно переопределить)

7       День года        tm_yday          [1,366]

8       Летнее время     tm_isdst         -1, 0, 1


Здесь Атрибут — это поле объекта, к которому можно обращаться через оператор точка [.]. Далее я покажу пример.

Как получить текущее время в Python?

Цифровое представление удобно для компьютера, но не для человека, поэтому, чтобы преобразовать секунды в объект struct_time, с которым уже понятнее работать, нам необходимо выполнить следующее:




from time import localtime, time

loc = localtime( time() )

print ('Ваше текущее время '  + loc) 

# Результат

# time.struct_time(tm_year=2019, tm_mon=11, tm_mday=9, tm_hour=13, tm_min=37, tm_sec=1, tm_wday=5, tm_yday=313, tm_isdst=0)

# пример того, как можно обращаться к полю объекта

print ( 'До конца года осталось: ' + 366 - loc.tm_yday )  


Как отформатировать время?

В модуле time много разных функции, одна из таких функции time.strftime предназначена для форматирования даты в соответствии с определенным шаблоном. По своему функционалу она похожа на такую же функцию из PHP, разве что формат строки будет несколько отличен.

Итак давайте выведем дату и время в более привычном для нас формате. Как это сделать будет показано в примере далее:




import time

ft = time.strftime('%d/%m/%Y %H:%M:%S')

print( ft )

# '09/11/2019 17:31:11'



%d, %m, %Y и др. — это спецификаторы, представляющие какой-то отдельный компонент времени. Таких спецификаторов более 30.

Таким образом, Python позволяет очень просто работать с датой и временем, а также форматировать время, представленное количеством секунд в любой удобный формат.


  • Создано 12.11.2019 12:51:57



  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Производительность в Python. Легкий путь / Хабр

Всегда знал, что одно из достоинств Python — возможность переписать самые тормозные куски кода на Си и увеличить быстродействие программы до недостижимых интерпретируемым языкам высот. Но сам ни разу не пробовал, т.к. считал что это слишком сложно. После прочтения этой статьи больше так не считаю.

Программисты знакомые с ctypes врядли найдут тут что-то интересное, новичков же прошу под кат.

Ctypes — механизм Python для импорта функций из внешних библиотек.
%timeit — magic-функция оболочки IPython, измеряющая время выполнения выражения на Python


Ctypes — это прекрасно! Давайте начнем с небольшого банального примера: суммирование чисел в определенном диапазоне.
Вот реализация этой функции на Python

def sumrange(arg):
    return sum(xrange(arg))

Отлично! Но что если мы попробуем суммировать действительно большой диапазон чисел, например от 0 до 10**8 (т.е. 100,000,000)

In [2]: %timeit sumrange(10**2)
1000000 loops, best of 3: 1.53 us per loop

In [3]: %timeit sumrange(10**8)
1 loops, best of 3: 9.77 s per loop

In [4]: %timeit sumrange(10**9)
1 loops, best of 3: 97.8 s per loop

Уже не так весело. Попробуем кое-что другое:

def sumrange2(arg):
    x = i = 0
    while i < arg:
        x += i
        i += 1
    return x

Что из этого получится?

In [10]: %timeit sumrange2(10**2)
100000 loops, best of 3: 10.5 us per loop

In [11]: %timeit sumrange2(10**8)
1 loops, best of 3: 18.5 s per loop

Вот это да… Так еще хуже… В этот раз даже не буду пробовать 10**9.
Так как же нам ускорить выполнение? Только не предлагайте математические оптимизации… мы же в новом мире компьютеров! (в оригинале: don’t suggest math tricks… this is the the new world of computing!)
Да, я знаю, что сложность алгоритма — постоянная величина и не зависит о величины аргумента, n*(n+1)/2. Но статья посвящена не этому.

Как насчет ctypes?

#include <stdio.h>

unsigned long long sumrange(unsigned long long arg)
{
    unsigned long long i, x;
    x = 0;

    for (i = 0; i < arg; i++) {
        x = x + i;
    }
    return x;
}

Сохраним с именем sumrange.c и скомпилируем (не будем использовать оптимизации для чистоты эксперимента):
$ gcc -shared -Wl,-install_name,sumrange.so -o sumrange.so -fPIC sumrange.c

Импортируем в Python то что получилось:

import ctypes
sumrange_ctypes = ctypes.CDLL('./sumrange.so').sumrange
sumrange_ctypes.restype = ctypes.c_ulonglong
sumrange_ctypes.argtypes = ctypes.c_ulonglong,

И Оскар получает…

In [15]: %timeit sumrange_ctypes(10**2)
1000000 loops, best of 3: 1.28 us per loop

In [16]: %timeit sumrange_ctypes(10**8)
1 loops, best of 3: 381 ms per loop

In [17]: %timeit sumrange_ctypes(10**9)
1 loops, best of 3: 3.79 s per loop

In [18]: %timeit sumrange_ctypes(10**10)
1 loops, best of 3: 37.8 s per loop

Итоговая сводка:





10**2 10**8 10**9 10**10
Чистый Python, способ №1 1.53 мкс 9.77 с 97.8 с
Чистый Python, способ №2 10.5 мкс 18.5 с
ctypes 1.28 мкс 381 мс 3.79 с 37.8 с

Адский прирост производительности!

Для Node.js хакеров, есть эквивалент ctypes — FFI (Foreign Function Interface): github.com/rbranson/node-ffi

Как узнать время выполнения программы Python?

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

python — как узнать время выполнения кода?

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

Python Timeit () с примерами

  • Домашняя страница
  • Тестирование

      • Назад
      • Гибкое тестирование
      • BugZilla
      • Cucumber
      • Тестирование базы данных
      • J27 9000 J27 Тестирование базы данных
      • 9000 J27
      • JUnit
      • LoadRunner
      • Ручное тестирование
      • Мобильное тестирование
      • Mantis
      • Почтальон
      • QTP
      • Назад
      • Центр контроля качества (ALM)
      • 000
      • RPA Управление тестированием
      • TestLink
  • SAP

      • Назад
      • ABAP
      • 900 03 APO

      • Новичок
      • Basis
      • BODS
      • BI
      • BPC
      • CO
      • Назад
      • CRM
      • Crystal Reports
      • MMO
      • HAN

      • Назад
      • PI / PO
      • PP
      • SD
      • SAPUI5
      • Безопасность
      • Менеджер решений
      • Successfactors
      • SAP Tutorials
  • Web
  • Web
  • AngularJS
  • ASP.Net
  • C
  • C #
  • C ++
  • CodeIgniter
  • СУБД
  • JavaScript
  • Назад
  • Java
  • JSP
  • Kotlin
  • Linux
  • Linux
  • Kotlin
  • Linux
  • js

  • Perl
  • Назад
  • PHP
  • PL / SQL
  • PostgreSQL
  • Python
  • ReactJS
  • Ruby & Rails
  • Scala
  • SQL
  • 000

  • SQL
  • 000

    0003 SQL

    000

    0003 SQL

    000

  • UML
  • VB.Net
  • VBScript
  • Веб-службы
  • WPF
  • Обязательно учите!

      • Назад
      • Бухгалтерский учет
      • Алгоритмы
      • Android
      • Блокчейн
      • Business Analyst
      • Создание веб-сайта
      • CCNA
      • Облачные вычисления
      • 00030003 COBOL 9000 Compiler
          9000 Встроенные системы

        • 00030002 9000 Compiler 9000
        • Ethical Hacking
        • Учебники по Excel
        • Программирование на Go
        • IoT
        • ITIL
        • Jenkins
        • MIS
        • Сеть
        • Операционная система
        • Назад
        • Управление проектами Обзоры
        • Salesforce
        • SEO
        • Разработка программного обеспечения
        • VB A
    • Big Data

        • Назад
        • AWS
        • BigData
        • Cassandra
        • Cognos
        • Хранилище данных
        • 0003

        • HBOps
        • 0003

        • HBOps
        • 0003

        • MicroStrategy
        • MongoDB

    .

  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    2021 © Все права защищены. Карта сайта