Получить функцию времени выполнения в Python - PullRequest
2 голосов
/ 09 декабря 2011

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

def get_execution_time(function, args, numberOfExecTime=1):
    """Return the execution time of a function in seconds.

    """

    return round(Timer(partial(function, args)).timeit(numberOfExecTime), 5)

Кстати, у меня проблема: я не могу дать несколько входов (аргументов) для функции, которая будет синхронизирована.Как я могу это сделать?Является ли частичное правильным инструментом?

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

Ответы [ 4 ]

4 голосов
/ 09 декабря 2011

Если вы можете пожертвовать способностью иметь значение по умолчанию для аргумента numberOfExecTime, вы можете сделать это следующим образом:

from timeit import Timer
from functools import partial

def get_execution_time(function, numberOfExecTime, *args, **kwargs):
    """Return the execution time of a function in seconds."""
    return round(Timer(partial(function, *args, **kwargs))
                 .timeit(numberOfExecTime), 5)

def foo(a, b, c = 12):
    print a, b, c

get_execution_time(foo, 1, 3, 4, c = 14)

Или вы можете сделать это так и при этом иметь значение по умолчанию для numberOfExecTime:

from timeit import Timer
from functools import partial

def get_execution_time(function, *args, **kwargs):
    """Return the execution time of a function in seconds."""
    numberOfExecTime = kwargs.pop('numberOfExecTime', 1)
    return round(Timer(partial(function, *args, **kwargs))
                 .timeit(numberOfExecTime), 5)

def foo(a, b, c = 1):
    print a, b, c

get_execution_time(foo, 1, 2, c = 2)
# => 1 2 2

get_execution_time(foo, 4, 5, c = 3, numberOfExecTime = 2)
# => 4 5 3
# => 4 5 3
3 голосов
/ 09 декабря 2011

Вы можете передать несколько аргументов: args должен быть кортежем, содержащим аргументы для передачи.

Теперь вы можете передать *args вместо args.

(Есливам также нужно передать kwargs в ваш метод, затем ввести в get_execution_time другой аргумент kwargs и передать **kwargs вашему function)

def get_execution_time(function, args=(), kwargs ={}, numberOfExecTime=1):
    return round(Timer(partial(function, *args, **kwargs)).timeit(numberOfExecTime), 5)
2 голосов
/ 28 февраля 2013

Я бы использовал декоратор времени.

import time

def timeit(f):

    def timed(*args, **kw):

        ts = time.time()
        result = f(*args, **kw)
        te = time.time()

        print 'func:%r args:[%r, %r] took: %2.4f sec' % \
          (f.__name__, args, kw, te-ts)
        return result

    return timed

Использовать декоратор просто или используйте аннотации.

@timeit
def compute_magic(n):
     #function definition
     #....

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

compute_magic = timeit(compute_magic)

Мой пост в блоге содержит больше информации. http://blog.mattalcock.com/2013/2/24/timing-python-code/

0 голосов
/ 09 декабря 2011

Если args это list аргументов, вы можете расширить его с помощью *args:

return round(Timer(partial(function, args)).timeit(numberOfExecTime), 5)
...