Несоответствие между% time и% timeit в IPython - PullRequest
24 голосов
/ 23 декабря 2011

Я столкнулся со странной ситуацией, которую не могу объяснить. Вот мой тестовый выбор времени генерации большого списка кортежей:

In [1]: def get_list_of_tuples():
   ...:     return [(i,) for i in range(10**6)]
   ...:

In [2]: %time res = get_list_of_tuples()
CPU times: user 0.93 s, sys: 0.08 s, total: 1.01 s
Wall time: 0.98 s

In [3]: %timeit res = get_list_of_tuples()
1 loops, best of 3: 92.1 ms per loop

Как видите, генерация этого большого списка кортежей занимает чуть меньше секунды. timeit сообщает, что время выполнения составляет около 0,1 секунды. Почему в двух отчетах такая большая разница?

(протестировано на IPython 0.11, Python 2.6.5.)

Ответы [ 3 ]

31 голосов
/ 04 января 2012

Основное отличие состоит в том, что " по умолчанию timeit () временно отключает сборку мусора во время ".

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

In [1]: import timeit

# Garbage collection on.
In [2]: N = 10; timeit.timeit('[(i,) for i in range(10**6)]', 'gc.enable()', number=N) / N
Out[2]: 0.74884700775146484
# 749 ms per loop.

# Garbage collection off.
In [3]: N = 10; timeit.timeit('[(i,) for i in range(10**6)]', number=N) / N
Out[3]: 0.15906109809875488
# 159 ms per loop.
3 голосов
/ 23 декабря 2011

Benoit

Если я использую Python 2.6.6 и IPython 0.10, я вижу похожие ответы на ваши. Используя Python 2.7.1 и IPython 0.10.1, я получаю что-то более разумное:

% ipython
Python 2.7.1 (r271:86832, Nov  3 2011, 16:23:57) 
Type "copyright", "credits" or "license" for more information.

IPython 0.10.1 -- An enhanced Interactive Python.

In [1]: def get_list_of_tuples():
   ...:     return [(i,) for i in range(10**6)]
   ...: 

In [2]: %time res = get_list_of_tuples()
CPU times: user 0.25 s, sys: 0.10 s, total: 0.35 s
Wall time: 0.35 s

In [3]: %timeit res = get_list_of_tuples()
1 loops, best of 3: 215 ms per loop
0 голосов
/ 23 декабря 2011

% time - запускает оператор только один раз и имеет ошибку измерения

% timeit - запускает оператор несколько раз и выбирает наиболее точное время.

См. Документация модуля Python timeit для некоторых объяснений

...