jupyter notebook からソースコードだけを抽出する方法

jupyter notebook からソースコードだけを抽出する方法です

2行でまとめると

  • nbconvertを使う方法が定番.でも動作が遅い
  • 20倍以上高速な jq を使う方法がおすすめ

となります.以下,詳細です.

nbconvert を使う方法

input.ipynb からpythonコードを取り出して test.py に保存する場合は以下のコマンドを実行します.

$ jupyter nbconvert --to script input.ipynb  --output test

jq を使う方法

上述の nbconvert は高機能ですが,動作が遅いです.nbconvertはpythonで記述されているためです.

別解として jq を使う方法があります.

$ jq -j '.cells  | map( select(.cell_type == "code") | .source + ["\n\n"] )  | .[][]'   < input.ipynb > test.py


こんなコード,毎回入力できませんね.シェルスクリプトにします

ipynb2py.sh

#!/bin/sh

if [ -z "$1" ]; then
	echo "usage:"
	echo "    $0  input.ipynb"
	exit 1
fi

cat $1 | jq -j '.cells  | map( select(.cell_type == "code") | .source + ["\n\n"] )  | .[][]'   

この内容を ipynb2py.sh という名前で保存します. ipynb2py.sh はPATHが通ってるディレクトリに配置しましょう.これで簡単にjq が利用できます.

ipynb2py.sh の使い方

ソースコードを変換するなら

$ ipynb2py.sh  input.ipynb > test.py

ソースコードをちょっとみるだけなら

$ ipynb2py.sh  input.ipynb 

コードが長い場合は

$ ipynb2py.sh  input.ipynb  | lv

などと実行できます.

jq はどれくらい速いのか?

MacBook(M1)で実行時間を計測しました

nbconvert の場合

real	0m1.221s
user	0m0.845s
sys	0m0.186s

jq の場合

real	0m0.049s
user	0m0.037s
sys	0m0.010s

jq の方が20倍以上高速でした.

ソースコードを見るだけの用途で考えると,1秒以上掛かる nbconvert は処理がもたつくと感じます.個人的には jq 一択です.