Подтвердить что ты не робот

Как запустить магию IPython из script (или выбрать время Python script)

Команда IPython% timeit magic отлично выполняет свою работу для измерения времени, необходимого для запуска некоторого кода Python. Теперь я хочу использовать что-то аналогичное в Python script. Я знаю о модуле timeit, однако, он имеет несколько недостатков, например, как выбрать количество запусков адаптивно? то есть код по умолчанию

import timeit
t=timeit.Timer("code(f)", "from __main__ import code,f")
t.timeit() 

запускает код миллион раз. Магическая команда% timeit IPyhton делает это автоматически. Я предлагаю использовать что-то вроде кода MATLAB http://www.mathworks.com/matlabcentral/fileexchange/18798

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

Как я могу называть% timeit magic из Python script (или, может быть, есть лучшее решение для синхронизации)?

4b9b3361

Ответ 1

Это зависит от того, какая версия IPython у вас есть. Если у вас есть 1.x:

from IPython import get_ipython
ipython = get_ipython()

Если у вас установлена ​​более старая версия:

import IPython.core.ipapi  
ipython = IPython.core.ipapi.get()

или

import IPython.ipapi  
ipython = IPython.ipapi.get()

После выполнения запустите магическую команду следующим образом:

ipython.magic("timeit abs(-42)")

Обратите внимание, что script должен выполняться через ipython.

Ответ 2

Оба модуля IPython и timeit при вызове с python -m timeit выполняют один и тот же цикл с растущим значением числа до тех пор, пока результат синхронизации не превысит определенный порог, который гарантирует измерение времени, в основном, без вмешательства операционной системы.

Вы можете сравнить реализацию IPython магии %timeit с стандартным модулем Python timeit чтобы увидеть, что они делают в основном то же самое.

Итак, отвечая на ваш вопрос, вы, вероятно, должны повторить тот же цикл, пока не найдете правильное значение для параметра number.

Ответ 3

Следующее работает, если вы запускаете Python script интерактивно в IPython. Например, test.py:

def f():
    # Algorithm 1
    pass

def g():
    # Algorithm 2
    pass

# which one is faster?
mgc = get_ipython().magic
mgc(u'%timeit f()')
mgc(u'%timeit g()')

Затем запустите его в интерактивном режиме в IPython

%run -i test.py

чтобы выплеснуть тайминги. Переключатель -i необходим, чтобы переменные находились в области видимости. Я не понял, как это сделать, не запуская экземпляр IPython, т.е. Просто импортируя timeit из IPython и используя его как функцию. Однако это решение работает для моих целей, которое заключается в автоматизации некоторых сроков.

Ответ 4

Одним из способов запуска функции ipython magic, вероятно, является использование встроенного экземпляра ipython.
Например: (большинство кодов заимствовано из сайта ipython)

from IPython.terminal.embed import InteractiveShellEmbed

ipshell = InteractiveShellEmbed()
ipshell.dummy_mode = True
print('\nTrying to call IPython which is now "dummy":')
ipshell.magic("%timeit abs(-42)");
ipshell()
print('Nothing happened...')

Это может работать с помощью интерпретатора python
PS: использование dummy_mode предотвратит вызов интерактивной оболочки.

Ответ 5

В соответствии с документацией модуля timeit.py, когда timeit запускается в режиме командной строки,

Если -n не задано, подходящее количество циклов вычисляется путем попытки последовательных степеней 10 до тех пор, пока общее время не достигнет как минимум 0,2 секунды.

Это то, что делает IPython. Вот почему количество циклов всегда имеет значение 10. Вы можете сделать что-то подобное в своем собственном коде, вставив вызов в t.timeit() внутри цикла, который заставит вас не ждать слишком долго:

import timeit
t = timeit.Timer("code(f)", "from __main__ import code, f")

max_time = 0.2
N = 0
curr_time = t.timeit(1)

while curr_time < max_time:
    N += 1
    curr_time = t.timeit(10**N)

mean_time = curr_time / float(10**N)

Это обеспечит, чтобы время профилирования составляло не менее 0,2 секунды, но не намного больше --- если вызов функции один раз занимает много времени.