Руководство для начинающих о том, как сделать Jupyter Notebook быстрее, мощнее и круче

Часть 1, Часть 2

Магические команды (Magic)

Magic — это отличные команды, упрощающие нашу жизнь при решении определенных задач. Часто похожи на команды Unix, но реализованы на Python. Магических команд в Python великое множество!

Существует 2 типа магических команд: строчные (применяются к одной строке) и ячеечные (применимы ко всей ячейке). Строчные команды начинаются с символа %, а ячеечные — с двух %%. Просмотреть все доступные команды можно через:

%lsmagic

Установка среды

Через%env вы можете управлять переменными среды в блокноте без перезагрузки. Для вывода списка всех имеющихся переменных в среде достаточно выполнить эту команду без переменных.

Вставка кода

С помощью %load можно добавлять код из внешнего скрипта (более подробно см. ниже). Например:

%load basic_imports.py

берет файл basic_imports.py и загружает его в блокнот.

Экспорт содержимого ячейки

Это невероятно полезная опция. %%writefile позволяет экспортировать содержимое ячейки в любое время и с минимальными усилиями. Например,

%%writefile thiscode.py

Здесь вы пишите какой-то код или функцию,
    которые хотите экспортировать
    и, возможно, использовать в дальнейшем!

Случалось ли вам в каждом документе импортировать одно и то же или добавлять те же самые функции? Теперь вы можете написать код один раз и пользоваться им всюду!

К примеру, можно создать файл basic_imports.py, содержащий следующий код:

%writefile basic_imports.py

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Так вы создадите .py файл, в котором будет перечислен основной импорт.

Загрузить его можно через:

%load basic_imports.py

Выполнение данной команды заменяет содержимое ячейки загруженным файлом.

# %load imports.py

import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt

Теперь можно еще раз запустить ячейку, чтобы импортировать все нужные модули и начать работу.

Сохранение и повторное использование кода через %macro

Вам, как и большинству людей, не раз приходилось прописывать одно и то же. Это могут быть и часто вычисляемые уравнения, и регулярно создаваемые строки кода. В Jupyter можно сохранять фрагменты кода в виде исполняемых макросов. Макрос — это просто код. Поэтому он может содержать переменные, которые необходимо определять до выполнения. Давайте попробуем!

Например:

name = ‘Kitten’

Для определения макроса нужен какой-то код. Мы можем сохранить почти что угодно: будь то строка, функция или что-то другое.

print(‘Hello, %s!’ % name)

Hello, Kitten!

Настраивать повторно используемые макросы мы будем через магические команды %load и %macro. Названия макросов принято начинать с двойного подчеркивания — так они отличаются от других переменных.

%macro -q __hello_you 32

Магическая команда %macro принимает имя и номер ячейки (или номера). Для большей лаконичности кода мы передаем –q. %store позволяет сохранять любую переменную для использования в других сеансах. В примере выше передавалось имя созданного макроса. Таким образом, мы сможем пользоваться им в других блокнотах или при отключении ядра.

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

%load __hello_you

А для выполнения макроса можно просто запустить ячейку с именем макроса.

__hello_you

Hello, Kitten! 

Получилось!

Давайте изменим переменную, которая использовалась в макросе.

name = ‘Muffins’

Теперь при запуске макроса берется это измененное значение.

__hello_you

Hello, Muffins! 

Все работает, поскольку макросы выполняют сохраненный код в области ячейки. Если бы не было определено name, то мы бы увидели ошибку.

Хотите пользоваться одинаковым макросом во всех блокнотах?

Магическая команда store

%store позволяет хранить макрос и пользоваться им во всех блокнотах.

Попробуйте открыть новый блокнот и повторить пример с %store -r __hello_you.

%store -r __hello_you
name = ‘Rambo’
%load __hello_you

Hello, Rambo! 

Магическая команда run

Команда %run выполняет код и отображает любой вывод, включая графики Matplotlib. С этой командой можно выполнять даже целые блокноты.

%run способен выполнять Python-код из .py-файлов. А еще он подходит для выполнения других блокнотов Jupyter.

Магическая команда pycat

%pycat покажет вам содержимое скрипта, если вдруг вы забыли, что в нем находится.

%pycat basic_imports.py

Автосохранение

Магическая команда %autosave позволяет изменять частоту автосохранения блокнота в его файл контрольных точек.

%autosave 60

Команда выше реализует автосохранение каждые 60 секунд.

Отображение графиков

%matplotlib inline

Скорее всего, вы и так знаете, что %matplotlib inline отображает графики Matplotlib в выводе ячейки. То есть вы можете добавлять графики и диаграммы Matplotlib напрямую в сами блокноты. Логичнее будет запустить эту команду в начале блокнота — в самой первой ячейке.

Управление временем

Существует две магические команды iPython для управления временем — %%time и %timeit. Они полезны тогда, когда код выполняется медленно, и вы пытаетесь отыскать причину. Обе команды имеют строковые и ячеечные режимы.

В отличие от %time, %timeit многократно запускает код и вычисляет среднее значение.

%%time дает информацию о единичном запуске кода в ячейке.

%%timeit использует Python-модуль timeit, который выполняет выражение несколько раз, а затем выдает среднее значение. Количество выполнений задается через –n, а количество повторений — через -r.

Выполнение кода из другого ядра

Вы можете выполнять ячейку на определенном языке. Существуют расширения для нескольких языков. Например:

  • %%bash
  • %%HTML
  • %%python
  • %%python2
  • %%python3
  • %%ruby
  • %%perl
  • %%capture
  • %%javascript
  • %%js
  • %%latex
  • %%markdown
  • %%pypy

Например, для рендеринга HTML в блокноте выполните следующее:

%%HTML
This is <em>really</em> neat!

Либо воспользуйтесь напрямую LaTeX через:

%%latex
This is an equation: $E = mc²$

Магическая команда who

Команда %who без аргументов выдает перечень переменных, существующих в глобальной области видимости. При передаче параметра (например, str) перечисляются переменные только этого типа. Так что если написать:

%who str

то вы увидите:

Магическая команда prun

%prun показывает количество времени, которое программа тратит на каждую функцию. %prun statement_name выводит упорядоченную таблицу с информацией о количестве вызовов каждой внутренней функции внутри оператора, времени каждого вызова, а также среднем времени всех запусков функции.

Магический отладчик в Python

В Jupyter есть собственный интерфейс для отладчика. С ним вы можете зайти в тело каждой функции и посмотреть, что там происходит. Активировать опцию можно через запуск %pdb в начале ячейки.

Графики в высоком разрешении

Одна простая строка магической команды iPython способна вывести график в двойном расширении для дисплеев Retina. Однако на прочих экранах ничего не отобразится.

%config InlineBackend.figure_format =’retina’

Пропуск ячейки (без выполнения)

В начале ячейки добавьте %%script false

%%script false

Здесь может быть длинный 
   код, который вы пока
   что не хотите выполнять

Уведомления

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

Для Linux (и Mac)

import os
duration = 1 # секунды
freq = 440 # Hz
os.system(‘play — no-show-progress — null — channels 1 synth %s sine %f’ % (duration, freq))

Для Windows

import winsound
duration = 1000 # миллисекунды
freq = 440 # Hz
winsound.Beep(freq, duration)

Для работы уведомления потребуется sox. Установить sox можно через:

brew install sox

…при условии, что у вас уже установлен менеджер пакетов Homebrew.

А теперь пора веселья!

Вы познакомились с набором полезных подсказок и советов по оптимизации Jupyter Notebook. Этой информации должно хватить на начальных этапах работы с оболочкой.

Читайте также:


Перевод статьи Anne Bonner: Tips, Tricks, Hacks, and Magic: How to Effortlessly Optimize Your Jupyter Notebook

Предыдущая статьяКак легко оптимизировать Jupyter Notebook. Часть 1
Следующая статьяПрототипирование с веб-компонентами: создание RSS Reader