Как получить время выполнения программы на Python? - PullRequest
742 голосов
/ 13 октября 2009

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

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

Ответы [ 27 ]

10 голосов
/ 18 мая 2016

time.clock ()

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

time.perf_counter ()

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

time.process_time ()

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

start = time.process_time()
... do something
elapsed = (time.process_time() - start)
8 голосов
/ 18 сентября 2017

Просто используйте 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

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

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)
8 голосов
/ 06 апреля 2016
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)
7 голосов
/ 03 марта 2015

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

$ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()"

Она запускает функцию your_module.main() один раз и печатает прошедшее время, используя функцию time.time() в качестве таймера.

Для эмуляции/usr/bin/time в Python см. Подпроцесс Python с / usr / bin / time: как получить информацию о времени, но игнорировать все другие выходные данные? .

Для измерения времени процессора (например, невключить время в течение time.sleep()) для каждой функции, вы можете использовать модуль profile (cProfile на Python 2):

$ python3 -mprofile your_module.py

Вы можете передать -p команде timeit выше, если выхотите использовать тот же таймер, что и модуль profile.

См. Как вы можете профилировать скрипт Python?

7 голосов
/ 20 мая 2015

Ipython "timeit" любой скрипт:

def foo():
    %run bar.py
timeit foo()
5 голосов
/ 20 октября 2014

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

5 голосов
/ 29 января 2015

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

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))
4 голосов
/ 28 марта 2018

Использование 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))]
3 голосов
/ 28 июля 2018

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

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

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

выход
Время процессора: пользовательский 4,54 мс, системный: 0 нс, всего: 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 (по оценкам): Пользователь: 0,00 с.
Система: 0,00 с.
Время стены: 0,00 с.

2 голосов
/ 07 августа 2018

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

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'

Я чувствую себя немного элегантно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...