Написать пост

Топ самых полезных магических команд для завсегдатаев Colab

Составили подборку из 9 команд для Google Colab или Jupyter Notebook, показали, как они работают на примерах, а также дополнили фишечками.

Обложка поста Топ самых полезных магических команд для завсегдатаев Colab

Если вы пользуетесь на повседневной основе в средами вроде Google Colab или Jupyter Notebook, то наверняка хотя бы раз сталкивались с “магическими” командами. В статье я  не только перечислю самые полезные из них, но и покажу, как они работают на примерах, а также дополню фишечками. 

%lsmagic

Чтобы не тратить драгоценный умственный ресурс, запомните всего одну директиву – вывести список всех команд. Запустив %lsmagic,  получаем вот такой интересный список:

			Available line magics:
%alias  %alias_magic  %autoawait  %autocall  %automagic  %autosave  %bookmark  
%cat  %cd  %clear  %colors  %conda  %config  %connect_info  %cp  %debug  
%dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  
%killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  
%logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro 
 %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %pastebin 
  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  
  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  
  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  
  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %shell  %store  
  %sx  %system  %tb  %tensorflow_version  %time  %timeit  %unalias  %unload_ext  
  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%bigquery  %%capture  %%debug  %%file  %%html  
%%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  
%%python2  %%python3  %%ruby  %%script  %%sh  %%shell  %%svg  %%sx 
 %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.
		

Magic Commands – это часть IPython, интерактивной оболочки с дополнительными командами, подсветкой кода и автодополнением. Команды выполняют разнообразные вспомогательные операции. Те, что начинаются с одного символа “%”, применяются к одной строке, другие — ко всей ячейке. Давайте разберем самые полезные “колабисту” мэджики.

%%time

Измеряет время выполнения ячейки. Это незаменимая утилита при оценке качества рефакторинга. Допустим, вы узнали, что цикл for замедляет код и переписали некоторый участок на перечисление (enumeration). Используя %%time, вы сможете с легкостью оценить прирост в общей скорости исполнения кода. Покажу на примере.

Объявим наш итерируемый список:

			lst = ['lorem', 'ipsum', 'dolor', 'sit', 'amen']
		

Замерим скорость итерации списка циклом while:

			%%time

i = 0
while i < len(lst):
  print(lst[i])
  i += 1
		

Ячейка выведет, помимо самих элементов списка, еще и время, затраченное на исполнение сниппета – 99 µs (миллионной доли секунды):

			lorem
ipsum
dolor
sit
amen
CPU times: user 83 µs, sys: 16 µs, total: 99 µs
Wall time: 103 µs
		

Перепишем код на функцию enumerate():

			%%time

for index, value in enumerate(lst):
  print(value)
		
			lorem
ipsum
dolor
sit
amen
CPU times: user 112 µs, sys: 11 µs, total: 123 µs
Wall time: 127 µs
		

Получается, что на маленьких списках while даже выигрывает у enumerate (99 микросекунд против 123).

%%capture

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

			%%capture
!pip install trio
		

%autoawait

Позволяет использовать параллельные процессы. Ультраполезная фича, когда речь заходит о предварительной обработке данных, где на одном конвейере предстоит обработать разные столбцы крупного датафрейма:

			import trio
from types import CoroutineType

def trio_runner(coro:CoroutineType):
     print('running asynchronous code')
     async def corowrap(coro):
         return await coro
     return trio.run(corowrap, coro)
		

В следующей ячейке запускаем магическую команду:

			%autoawait trio_runner

async def async_hello(name):
     await trio.sleep(1)
     print(f'Hello {name} world!')
     await trio.sleep(1)

await async_hello('async')
		

На выходе получаем параллельно исполненные ячейки:

			>>> running asynchronous code
Hello async world!
		

%debug

Активируeт интерактивный отладчик. 

Эта команда поддерживает два способа активации: перед выполнением кода (точка останова) и post-mortem (“посмертно”). Второй режим вы можете активировать, запустив %debug без каких-либо аргументов. Если только что произошло исключение, это позволит в интерактивном режиме проверить путь ошибки: 

			from IPython.core.debugger import set_trace

def my_function():
    x = 5
    set_trace()
    print(5)
my_function()
		

Ячейка не выведет цифру пять, хоть последняя часть функции этого и требует. Строка с print() будет исполнена, если прервать отладку, нажав на кнопку стоп:

			--KeyboardInterrupt--

KeyboardInterrupt: Interrupted by user
5
		

%pip

Множество сторонних библиотек подключается к проекту именно этой командой. 

Вот интересная фишка: помимо установки модуля по названию:

			!pip install fbprophet
		

вы можете устанавливать некоторые инструменты с помощью ссылки на репозиторий. 

В последнее время для одной из библиотек, которую использую при предварительном анализе данных – pandas_profiling, наблюдалась проблема установки стандартным способом. А вот с инсталляцией по ссылке все работает:

			!pip install https://github.com/pandas-profiling/pandas-profiling/archive/master.zip
from pandas_profiling import ProfileReport
		

%precision

Указывает число знаков после запятой (decimal number) для числовых объектов.

			from math import pi

%precision 3
pi
		
			3.142
		

%rerun

Перезапускает предыдущую ячейку. В моей практике это полезно, чтобы пересобрать, к примеру, эмоциональную окраску (позитивная / негативная) реплики пользователя на базе библиотеки dostoevsky. Но пример приведу чуть проще:

			print('Привет')
		
			>>> Привет
		
			%rerun
		
			>>>  === Executing: ===
print('Привет')
=== Output: ===
Привет
		

%%html

Отрендерит ячейку как код HTML. Таким же образом исполнит код на Javascript, Perl или Ruby! Вот это действительно удивительное дополнение. Только используйте с осторожностью!

Более того, для учебы нередко пригождается верстка формул на специальном стандарте LaTeX, или справочной информации на Markdown. Для самых креативных предусмотрели даже рендеринг из .svg.

			%%html
<html>
  <ul>
    <li>Element 1</li>
    <li>Element 2</li>
  </ul>
</html>
		

Заключение

Помню, на учебе пару раз выполнила некоторые из магических команд. И забыла до тех пор, пока случайно не наткнулась снова и не влюбилась окончательно. 

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

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

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

Следите за новыми постами
Следите за новыми постами по любимым темам
3К открытий5К показов