Магия IPython% timeit - изменение вывода со среднего и стандартного на лучшее из 3

Я использую интеграцию IPython 6.2.1 с Eclipse/PyDev в Ubuntu. Версия Python – 3.5.2.
Я часто вижу, как люди выбирают время для скрипта, например

>>>%timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

Когда я выполняю ту же операцию, мой вывод

>>>%timeit for _ in range(1000): True
20.8 µs ± 353 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Имхо, "лучшее из 3" - лучшая мера, поэтому я хотел бы изменить свой вывод. Я прочитал оба: IPython и документация Python timeit. Они оба даже не упоминают, что вывод может отличаться от «лучшего из 3». Это вопрос реализации Linux/Eclipse/PyDev или есть способ изменить вывод модуля timeit?

P.S.: То же самое происходит в консоли Eclipse, когда я использую timeit, поэтому IPython, вероятно, здесь неуместен.

>>>timeit '"-".join(str(n) for n in range(100))'
11 ns ± 0.0667 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

Унутбу указал, что вы можете добиться желаемого поведения внутри программы. Выполнение первого сценария, вызывающего timeit.main() здесь, действительно возвращает лучшее из 3. Но я бы предпочел версию, которую я могу запускать в интерактивном режиме консоль Эклипс.


person Mr. T    schedule 11.02.2018    source источник
comment
best of 3 — это старый стиль отображения. Вероятно, это изменилось в каком-то ipython релизе. В модуле timeit могут быть изменения, но я все еще использую Py 3.5.   -  person hpaulj    schedule 11.02.2018
comment
Из %timeit?? видно, что отображение создается объектом IPython.core.magics.execution.TimeitResult(loops, repeat, best, all_runs, compile_time, precision).   -  person hpaulj    schedule 11.02.2018
comment
Я не использую Eclipse, но я предполагаю, что он использует ipython, а не timeit напрямую.   -  person hpaulj    schedule 11.02.2018


Ответы (2)


Дисплей генерируется объектом TimeitResult (см. листинг кода timeit??). С опцией -o я получаю этот объект, который я могу проверить:

In [95]: %timeit -o np.einsum('bdc,ac->ab', a, b, optimize=False)
170 µs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Out[95]: <TimeitResult : 170 µs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)>
In [96]: res = _
In [97]: print(res)
170 µs ± 27.5 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [98]: vars(res)
Out[98]: 
{'_precision': 3,
 'all_runs': [1.6981208299985155,
  1.6976570829865523,
  1.6978941220149864,
  1.6976559630129486,
  1.6976608499826398,
  1.697147795028286,
  1.6977746890042908],
 'best': 0.0001697147795028286,
 'compile_time': 0.0,
 'loops': 10000,
 'repeat': 7,
 'timings': [0.00016981208299985155,
  0.00016976570829865524,
  0.00016978941220149863,
  0.00016976559630129485,
  0.00016976608499826398,
  0.0001697147795028286,
  0.0001697774689004291],
 'worst': 0.00016981208299985155}

Похоже, что информация для создания дисплея best of 3 все еще там, но средство форматирования исчезло. Это может быть найдено в более старой версии.

@property
def average(self):
    return math.fsum(self.timings) / len(self.timings)

Код находится в IPython/core/magics/execution.py

person hpaulj    schedule 11.02.2018
comment
Означает ли это, что более новые версии отказались от концепции «лучшее из 3»? Я нашел эту тему на github от 2016 года. Ну, я могу жить с новой концепцией, хотя я думаю, что она менее точна. Было бы неплохо, если бы они включали возможность выбора отображаемой информации. Вы наглядно продемонстрировали, что информация есть. - person Mr. T; 11.02.2018
comment
Кто-то запросил отображаемый вариант, github.com/ipython/ipython/issues/10712 - person hpaulj; 11.02.2018

Этот синтаксис std/mean/dev был добавлен в IPython 5 октября 2016 г. См. вопрос № 9984 https://github.com/ipython/ipython/pull/9984 об этом улучшении. И реализация здесь:

«Добавлено среднее значение + stdv к магии %timeit — ожидаются новые тесты —»

https://github.com/ipython/ipython/commit/509d8539c555ede6222d13cf1693388429213853#diff-ee52fbe4422737ccaa3d6d0b15ea5189

но синтаксис «лучшее из 3» исходит из модуля python timeit в функции main (), и это обычно одинаково в python2 и 3.

person karol    schedule 11.02.2018