синхронизация двух алгоритмов (python) с использованием timeit или time

У меня возникли проблемы с использованием функций time или timeit для определения времени выполнения двух алгоритмов в python. Пока у меня это

def normal(sound):
  for s in getSamples(sound):
    largest=max(0,getSampleValue(s))
    amplification = 32767.0/largest
  for s in getSamples(sound):
    louder = amplification*getSampleValue(s)
    setSampleValue(s,louder)

def onlyMax(sound):
  for s in getSamples(sound):
    value=getSampleValue(s)
    if value>0:
      setSampleValue(s,32767)
    if value<=0:
      setSampleValue(s,-32768)

import time
def timetwoalgorithms(sound):
    print time.time("normal(sound)","onlyMax(sound)")

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


person ddbg    schedule 28.08.2014    source источник
comment
Я не уверен, что полностью понимаю функцию timeit или time, но некоторая помощь будет оценена, похоже, я не могу найти ответ в стеке.   -  person ddbg    schedule 28.08.2014
comment
Я написал ответ на этот здесь   -  person Noelkd    schedule 28.08.2014


Ответы (2)


time.time показывает текущее время. Вы хотите timeit.timeit.

print(timeit.timeit("normal(sound)"))
print(timeit.timeit("onlyMax(sound)"))

Однако вы не можете передавать локальные переменные в timeit (как передавать параметры функции при использовании timeit.Timer()), поэтому вам, возможно, придется упростить вашу функцию. Вы можете либо переопределить timeit:

def timeit(exec_s, globals={}, number=10000):
    t = time.time()
    for i in range(number):
        exec(exec_s, globals)
    return time.time() - t

и делать

print(timeit("normal(sound)", locals()))
print(timeit("onlyMax(sound)", locals()))

или поместите переменные в пространство имен модулей в соответствии с ответом @Martijn Pieters. Или, включив временной цикл в основную функцию:

def time2algorithms(sound, number=10000):
    t = time.time()
    for i in range(number):
        normal(sound)
    print(time.time() - t)
    t = time.time()
    for i in range(number):
        onlyMax(sound)
    print(time.time() - t)
person matsjoyce    schedule 28.08.2014
comment
Итак, когда я внедряю timeit в функцию, должен ли я заменить exec_s на имя функции? Ошибка, которую я получаю, ожидает переменную. Если нет, я не думаю, что у меня есть ручка на это - person ddbg; 28.08.2014
comment
exec_s — это строка для выполнения, как и для timeit.timeit. Это может быть любой исполняемый файл Python в виде строки. Так что в вашем случае это либо "normal(sound)", либо "onlyMax(sound)". Однако, если вы не хотите использовать вспомогательную функцию, вы можете просто заменить exec(exec_s, globals) на normal(sound). См. редактирование. - person matsjoyce; 28.08.2014
comment
Кажется, теперь это работает, однако снова я получаю смерть потока, когда он пытается выполнить программу диапазона через временной цикл. - person ddbg; 28.08.2014

Функция time.time() не принимает никаких аргументов, так как это функция, которая просто возвращает текущее время (в виде секунд с определенного момента времени, эпохи UNIX). Вы не можете использовать его для сравнения двух сред выполнения функций. Вы можете использовать его для измерения времени, сохраняя значение перед запуском функции, а затем сравнивая его со значением time.time(), но это плохой метод измерения производительности.

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

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

timeit.timeit("normal(sound)", 'from __main__ import normal, sound')

Сделайте это еще раз для функции other и сравните результаты друг с другом.

Учтите, что функция будет выполняться много раз (вы можете настроить количество раз), поэтому, если функция меняет глобальное состояние, вам придется каждый раз сбрасывать это состояние. Это также изменит способ измерения производительности.

person Martijn Pieters    schedule 28.08.2014