thumbnail

【IPython】magic commandまとめ

2022/11/18

個人的に使えるなと思ったIPythonのmagic commandをまとめてみました。

%lsmagic

現在のnotebookで使用可能なIPythonのmagic command一覧を表示します。

In[1]: %lsmagic
Out[2]:
  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

補足: magic command + ?でdocument参照

例えば%timeitコマンドのdocumentを見たい場合は%timeit?を実行することで仕様を確認できます。

%pwd, %ls, %pip...

kernelでのコマンドはmagic commandで使用可能な場合が多いです。

In[1]: %pwd
Out[1]: /content

In[2]:
  current_dir = %pwd
  print(current_dir)
Out[2]:
  /content

補足: !を使うとシェルコマンド実行

magic commandではありませんが、!を使用してもシェルコマンドを実行できます。

In[1]: !ls
Out[1]: sample_data

notebook上からでもshell操作ができるのでよく使います。

※ ただし、作業ディレクトリを移動するために!cdを使用しても、実際に移動することはできません。

In[1]: !pwd
Out[1]: /content/sample_data

In[2]:
  !cd ..
  !pwd
Out[2]
  /content/sample_data

これはノートブック内の!シェルコマンドが一時的なサブシェルで実行されるからです。 永続的に作業ディレクトリを変更したい場合は%cdを使いましょう。

%%writefile

%%writefileをセルに記載しておくと、実行時にセルの中身を指定ファイル先へ書き込みます(ファイルがない場合は生成します)。

%%writefile hello.py
def hello():
  print('Hello!!!')

def bye():
  print('bye...')

↑は同フォルダ内にhello関数とbye関数が定義されたhello.pyを生成します。

%load

指定ファイル先のファイルを読み込みセルに転記します。 指定先は相対パスだけではなく、URL指定も可能です。

%load hello.py

↓実行後

# %load hello.py
def hello():
  print('Hello!!!')

def bye():
  print('bye...')

また、オプションsを使用することで特定のクラスや関数のみをロードすることも可能です。

# %load -s hello hello.py
def hello():
  print('Hello!!!')

%run

セル内でそのままpythonを実行してしまいたい、という場合には%runが使えます。

%run main.py

%prun, %%prun

%prunはprofileモジュールを使ってpythonコードをプロファイリングすることができます。 プロファイルとはどの関数でどれぐらい時間がかかっているかを調べることです。

例えば以下の関数を%prunすると

import time

%prun time.sleep(1)

↓このような結果が得られます。

         4 function calls in 1.001 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    1.001    1.001    1.001    1.001 {built-in method time.sleep}
        1    0.000    0.000    1.001    1.001 {built-in method builtins.exec}
        1    0.000    0.000    1.001    1.001 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

ncallsなどの意味ですが、それぞれ以下のとおりになります。

  • ncalls
    呼び出し回数
  • tottime
    関数の実行にかかった時間の合計(別の関数呼び出しにかかった時間を除く)
  • cumtime
    関数の実行にかかった時間の合計(別の関数呼び出しにかかった時間を含む)
  • percall
    かかった時間を呼び出し回数で割ったもの

%prun 関数だとその関数のプロファイリング、%%prunだとセル内関数のプロファイリングを行います。

%time, %%time, %timeit, %%timeit

処理時間を計りたい場合は%timeが使えます。

In[1]: %time a = [x ** 2 for x in range(100000)]
Out[1]:
  CPU times: user 41.7 ms, sys: 5.62 ms, total: 47.3 ms
  Wall time: 57.2 ms

%%timeはセル全体の処理時間を計ります。

In[1]:
  %%time
  a = [x ** 2 for x in range(100000)]
  sum(a)
Out[1]:
  CPU times: user 41.5 ms, sys: 4.84 ms, total: 46.3 ms
  Wall time: 60.6 ms

%timeit -r [R] -n [N]は処理をR回実行し、各測定の中でN回プログラムを実行して統計量を計算します(オプションrnは省略可能ですが、デフォルトだとRが7回、Nが100000000回となるので場合によっては処理が完了するまでに時間がかかります)。

In[1]: %timeit -r 1000 -n 3 a = range(10000)
Out[1]: 288 ns ± 342 ns per loop (mean ± std. dev. of 1000 runs, 3 loops each)

%%timeit%timeitのセル実行版です。

%who, %who_ls, %whos

IPython上で定義されている変数の詳細を知りたい場合は%who%who_ls%whosなどが使えます。

In[1]:
  a = 1
  b = 'hoge'

In[2]: %who
Out[2]: a	 b

In[3]: %who_ls
Out[3]: ['a', 'b']

In[4]: %whos
Out[4]:
  Variable   Type    Data/Info
  ----------------------------
  a          int     1
  b          str     hoge

%whoは定義されている変数名の表示、%who_lsは変数名を配列として取得、%whosは変数名と型、データの詳細を表示します。

%reset

定義済みの変数や関数をリセットします。

In[1]:
  a = 1
  b = 'hoge'

In[2]: %who
Out[2]: a	 b

In[3]: %reset

In[4]: %who
Out[4]: Interactive namespace is empty.

%env

カーネル上で定義されている環境変数一覧を表示します。

In[1]: %env
Out[2]:
  'ENV': '/root/.bashrc',
  'NCCL_VERSION': '2.8.4-1',
  'TF_FORCE_GPU_ALLOW_GROWTH': 'true',
  'NO_GCE_CHECK': 'False',
  'PWD': '/',
  'NVARCH': 'x86_64',
  'HOME': '/root',
  ...

%%javascript, %%sh, %%bash, %%markdown, %%latex...

pythonしか実行できないと思われがちですが、magic commandを使用することでjavascriptbashスクリプトなども実行できたりします。

%%javascript

const num1 = 12
const num2 = 10
const num3 = 35
let largest;

if(num1 >= num2 && num1 >= num3) {
    largest = num1;
}
else if (num2 >= num1 && num2 >= num3) {
    largest = num2;
}
else {
    largest = num3;
}

element.innerHTML =  '<h1>The Largest Number is : ' + largest + '</h1>'
author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

Profile

author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

© 2022 mitsuru takahashi