You are currently viewing Магические команды IPython

Магические команды IPython

В двух предыдущих разделах было показано, как IPython позволяет вам эффективно и интерактивно использовать и изучать Python. Здесь мы начнем обсуждать некоторые из улучшений, которые IPython добавляет поверх обычного синтаксиса Python. Они известны в IPython как магические команды и предваряются % символом. Эти магические команды предназначены для краткого решения различных распространенных проблем при стандартном анализе данных. Магические команды бывают двух видов: магия строк, которые обозначаются одним % префиксом и работают с одной строкой ввода, и магия ячеек, которые обозначаются двойным %% префикс и работать с несколькими строками ввода. Мы продемонстрируем и обсудим здесь несколько кратких примеров и вернемся к более сфокусированному обсуждению нескольких полезных магических команд позже в этой главе.

Вставка блоков кода: %paste и %cpaste

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

>>> def donothing(x):
...     return x

Код отформатирован так, как он будет отображаться в интерпретаторе Python, и если вы скопируете и вставите его непосредственно в IPython, вы получите сообщение об ошибке:

In [2]: >>> def donothing(x):
   ...:     ...     return x
   ...:     
  File "<ipython-input-20-5a66c8964687>", line 2
    ...     return x
                 ^
SyntaxError: invalid syntax

При прямой вставке интерпретатор сбивается с толку из-за дополнительных символов подсказки. Но никогда не бойся – %paste Волшебная функция IPython предназначена для обработки именно этого типа многострочного ввода с разметкой:

In [3]: %paste
>>> def donothing(x):
...     return x

## -- End pasted text --

%paste Команда одновременно вводит и выполняет код, так что теперь функция готова к использованию:

In [4]: donothing(10)
Out[4]: 10

Команда с аналогичным намерением %cpaste открывает интерактивное многострочное приглашение , в которое вы можете вставить один или несколько фрагментов кода, которые будут выполняться в пакетном режиме:

In [5]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:>>> def donothing(x):
:...     return x
:--

Эти волшебные команды, как и другие, которые мы увидим, предоставляют функциональность, которая была бы трудной или невозможной в стандартном интерпретаторе Python.

Запуск Внешнего Кода: %run

Когда вы начнете разрабатывать более обширный код, вы, скорее всего, обнаружите, что работаете как в IPython для интерактивного исследования, так и в текстовом редакторе для хранения кода, который вы хотите повторно использовать. Вместо того, чтобы запускать этот код в новом окне, может быть удобно запустить его в рамках сеанса IPython. Это можно сделать с %run помощью магии.

Например, представьте, что вы создали myscript.py файл со следующим содержимым:

#-------------------------------------
# file: myscript.py

def square(x):
    """square a number"""
    return x ** 2

for N in range(1, 4):
    print(N, "squared is", square(N))

Вы можете выполнить это из своего сеанса IPython следующим образом:

In [6]: %run myscript.py
1 squared is 1
2 squared is 4
3 squared is 9

Обратите также внимание, что после запуска этого сценария все функции, определенные в нем, будут доступны для использования в вашем сеансе IPython:

In [7]: square(5)
Out[7]: 25

Существует несколько вариантов точной настройки того, как выполняется ваш код; вы можете просмотреть документацию обычным способом, введя %run? интерпретатор IPython.

Время Выполнения Кода: %timeit

Другим примером полезной магической функции является %timeit функция , которая автоматически определяет время выполнения однострочного оператора Python, следующего за ним. Например, мы можем захотеть проверить эффективность понимания списка:

In [8]: %timeit L = [n ** 2 for n in range(1000)]
1000 loops, best of 3: 325 µs per loop

Преимущество %timeit заключается в том, что для коротких команд он автоматически выполняет несколько запусков для достижения более надежных результатов. Для многострочных операторов добавление второго % знака превратит это в магию ячеек, которая может обрабатывать несколько строк ввода. Например, вот эквивалентная конструкция с a for-петлей:

In [9]: %%timeit
   ...: L = []
   ...: for n in range(1000):
   ...:     L.append(n ** 2)
   ...: 
1000 loops, best of 3: 373 µs per loop

Мы сразу видим, что понимание списка в данном случае происходит примерно на 10% быстрее, чем при построении эквивалентного for цикла. Мы рассмотрим %timeit и другие подходы к коду синхронизации и профилирования в разделе Профилирование и код синхронизации.

Справка по магическим функциям: ?%magic, и %lsmagic

Как и обычные функции Python, функции IPython magic имеют строки документов, и доступ к этой полезной документации можно получить стандартным способом. Так, например, чтобы прочитать документацию по %timeit магии, просто введите это:

In [10]: %timeit?

Аналогичным образом можно получить доступ к документации для других функций. Чтобы получить доступ к общему описанию доступных магических функций, включая некоторые примеры, вы можете ввести это:

In [11]: %magic

Для быстрого и простого списка всех доступных магических функций введите это:

In [12]: %lsmagic

Наконец, я упомяну, что при желании довольно просто определить свои собственные магические функции. Мы не будем обсуждать это здесь, но если вам интересно, посмотрите ссылки, перечисленные в Других ресурсах IPython.