Интерактивный Python: не может заставить `% lprun` работать, хотя line_profiler импортирован правильно

Проблема

Большинство "магических функций" iPython отлично работают для меня сразу с места в карьер: %hist, %time, %prun и т.д. Однако я заметил, что %lprun не может быть найден с iPython, поскольку я первоначально установил его.

Попытка разрешить

Затем я обнаружил, что должен установить модуль line_profiler. Я установил этот модуль, но по-прежнему не могу заставить магическую функцию работать правильно. Если я попытаюсь вызвать %lprun, iPython все еще не сможет найти эту функцию. Если я назову его полным именем (line_profiler.magic_lprun), функция может быть найдена, но я не могу заставить ее работать вообще. Ниже приведен пример того, что я сделал (который шаг за шагом выполняется из книги "Python for Data Analysis" ):

Успешное использование %prun

[В:]

def add_and_sum(x, y):
    added = x + y
    summed = added.sum(axis=1)
    return summed

x = randn(3000, 3000)
y = randn(3000, 3000)

add_and_sum(x, y)

С этим я получаю приятный ответ, как и ожидалось:

[Выход:]

array([-23.6223074 , -10.08590736, -31.2957222 , ..., -14.17271747,
    63.84057725, -50.28469621])

И я могу выполнить магическую функцию профилирования %prun:

[В:]

%prun add_and_sum(x, y)

[Выход:]

6 function calls in 0.042 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.020    0.020    0.029    0.029 <ipython-input-27-19f64f63ba0a>:1(add_and_sum)
    1    0.013    0.013    0.042    0.042 <string>:1(<module>)
    1    0.009    0.009    0.009    0.009 {method 'reduce' of 'numpy.ufunc' objects}
    1    0.000    0.000    0.009    0.009 _methods.py:16(_sum)
    1    0.000    0.000    0.009    0.009 {method 'sum' of 'numpy.ndarray' objects}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Сбой при использовании %lprun

Но когда я пытаюсь %lprun, я ничего не могу получить:

[В:]

%lprun -f add_and_sum add_and_sum(x, y)

[Выход:]

ERROR: Line magic function `%lprun` not found.

И если я попытаюсь вызвать функцию со своим стандартным именем, она также не работает:

[В:]

line_profiler.magic_lprun -f add_and_sum.test test.add_and_sum(x, y)

[Выход:]

line_profiler.magic_lprun -f add_and_sum.test test.add_and_sum(x, y)
                                       ^
SyntaxError: invalid syntax

Но библиотека была импортирована правильно, или, по крайней мере, это то, что она говорит:

[В:]

line_profiler

[Выход:]

<module 'line_profiler' from '/Users/<edit>/anaconda/lib/python2.7/site-packages/line_profiler-1.0b3-py2.7-macosx-10.5-x86_64.egg/line_profiler.pyc'>

[В:]

line_profiler.magic_lprun

[Выход:]

<function line_profiler.magic_lprun>

Кажется, что есть что-то дополнительное, что я должен настроить так, чтобы эти новые магические функции, которые я добавляю, можно идентифицировать как таковые. Я не смог найти ничего через веб-поиск.

Я запускаю Spyder как IDE (все еще использую iPython в качестве консоли), но я также пробовал его напрямую с iPython и с iPython ноутбуком. Мне не повезло в любом формате.

Ответ 1

Чтобы сделать работу %lprun, вам необходимо загрузить расширение в свой сеанс, используя следующую команду:

In [1]: %load_ext line_profiler

Ознакомьтесь с этим ноутбуком, чтобы увидеть некоторые примеры использования волшебства.

Кроме того, если вы работаете со Spyder, есть и сторонний плагин line_profiler, который вы можете найти здесь.

Ответ 2

У вас есть два способа сделать работу %lprun, одно решение является временным, т.е. оно продолжается до тех пор, пока вы не закончите сеанс ipython, а другой будет постоянным.

Временный: (как ответ Карлоса Кордовы)

После запуска ipython выполните следующее:

In [1]: %load_ext line_profiler

Постоянный:

Добавьте следующие строки в ~/.ipython/profile_default/ipython_config.py:

c.TerminalIPythonApp.extensions = [
    'line_profiler',
]

Если у вас нет файла ~/.ipython/profile_default/ipython_config.py, вы можете его создать (см. this для получения дополнительной информации):

ipython profile create