Эффективность Dict, измеренная с помощью timeit, возвращает два значения вместо одного

Я тестирую defaultdict() против dict.setdefault() эффективность использования timeit, По какой-то причине исполнение timeit возвращает два значения;

из коллекций импорт defaultdict из timeit importit timeit

dd = defaultdict(list)
ds = {}

def dset():
    for i in xrange(100):
        ds.setdefault(i, []).append(i)

def defdict():
    for y in xrange(100):
        dd[y].append(y)

Затем я печатаю время выполнения обеих функций и получаю 4 значения повторно;

print timeit('dset()', setup='from def_dict import dset')
print timeit('defdict()', setup='from def_dict import defdict')

22.3247003333
23.1741990197
11.7763511529
12.6160995785

Timeit.timeit документы говорит

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

Я на Python 2.7.

  • Разве время не должно возвращать одно значение? Также примеры, которые я видел онлайн, возвращают одно значение.
  • Каково второе значение тогда?

1 ответ

Решение

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

if __name__ == "__main__":

Чуть выше ваших утверждений timeit, это также решит проблему и вызовет timeit только один раз (каждый).

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

Другие вопросы по тегам