Эффективность 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 только один раз (каждый).
Что касается того, почему эти два значения отличаются, я должен был бы предположить, что второе является исходным выполненным вызовом, и, как таковое, печатается после второго возврата и печати, что означает, что у него есть дополнительная задержка а) вывода в буфер печати б) время возврата с другого звонка.