Jupyterからmarimoへ
これは Zenn 初投稿の記事です!!!
読みづらい部分や誤りがあれば、ぜひコメントで教えていただけると嬉しいです!
Jupyter Notebook から marimo に移行して感じたこと
最近、Jupyter Notebook から marimo に移行しました。
その中で感じた悩みや、marimo を使って「これは良い!」と思ったポイントをまとめます。
Jupyter Notebook を使っていたときの悩み
ipynb は git で管理しづらい
- Jupyter は JSON 形式なので、meta data や実行回数などが大量に差分として出てしまい読みにくい
- marimo 側のブログでも「Jupyter の diff は巨大で読みづらい」問題が指摘されている
- pre-commit で自動整形したり、nbstripout を試したりもしたが、根本的に扱いづらい
セル順序を無視した「再現できない状態」ができあがる
- 自分の使い方が悪いのもあるが、試行錯誤しているうちに 内部状態がぐちゃぐちゃになる
- 最初から実行するとエラーが出るのに、今の状態では動く…というノートブックが量産されていた
そんな中で「marimo」と出会う
-
Jupyter の“隠れた状態”問題を解決しようとしている
-
Git フレンドリー(.py で保存)
-
セル依存関係の自動管理
など、“Jupyter の弱いところ”を全部埋めるような設計になっていた
🐍 marimo とは?
marimoはリアクティブなPythonノートブックです:セルを実行したりUI要素を操作すると、marimoは自動的に依存するセルを実行(またはそれらを古いものとしてマーク)し、コードと出力の一貫性を保ちます。
marimoノートブックは純粋なPythonとして保存され、スクリプトとして実行でき、アプリとして展開できます。
ー README_Japanese より
https://github.com/marimo-team/marimo/blob/main/README_Japanese.md
まとめると…
Jupyter Notebook を代替でき、Git で管理しやすく、UI 付きアプリにもなる “モダンな Python Notebook”
実際に使って感動したポイント
- .py で保存されるので git 管理が爆ラク
- 差分が小さく、PR レビューしやすい
- JSON 山盛りの diff を見る必要がない
- セルの依存関係を自動処理してくれる
- あるセルを変えると、自動的に「依存セル」も再実行
- 一貫性が保たれるため、「再現できないノートブック問題」が消える
- 変数の再定義に厳しい(安全)
-
他のセルと名前が衝突したら教えてくれる
→ 思わぬ上書きバグが防げて安心
- marimo コマンドひとつで “アプリ化” できる
marimo run notebook.py
- アプリとして UI 付きで動く
- 配布も簡単
- セル依存関係を DAG っぽく可視化
- どのセルがどこに依存しているか一目でわかり、構造が見える化される
まだ使いこなせていないけど良さそうな機能
-
UI コンポーネント(スライダー、ドロップダウンなど)が標準搭載
-
AI 機能(API key 設定で利用可能)
-
ノートブックは Python だが
mo.md()で Markdown、ビルトインで SQL も扱える→ Python / Markdown / SQL を 1 つにまとめられる
-
scratchpad
- ノートブックとは独立した一時的な環境
- 気に入ったコードはそのままノートブックに挿入可能
まだ慣れていない部分
- VS Code の Jupyter 拡張に慣れすぎており、同じ機能が使えないものもある
-
ショートカットを少し覚え直す必要がある設定から変更できました。 - VS Code から marimo を直接プレビューできるらしいが、まだやれていない
自分が marimo を使うときの基本フロー
# PowerShell
uv venv
.\.venv\Scripts\activate
uv pip install marimo
# 新規 notebook を作成して開く
marimo edit sandbox.py
よく使う marimo コマンド
| コマンド | 内容 |
|---|---|
marimo edit ファイル名 |
ファイルがなければ新規作成し、編集 UI を開く |
marimo run ファイル名 |
読み取り専用のアプリとして実行 |
marimo コードの構造
marimo の notebook は、以下のような Python ファイルとして保存される:
import marimo
app = marimo.App()
@app.cell
def _(a):
x = a + 1
return x
-
各セルは
@app.cellデコレータで定義 -
セルの依存関係は入力(引数)と出力(return)から自動推論される
-
実行結果やセッション情報は、
プロジェクト内の
__marimo__/session/以下に JSON としてキャッシュされる
アンダースコア変数で「セルローカル」にできる
marimo では、変数名がアンダースコア(_)で始まると、その変数はセルローカルとして扱われます
-
_tmpなどの変数は、**他のセルからは参照できない。**セルの引数やreturnに指定されなくなる - 複数のセルで同じ名前の
_tmpを使っても衝突しない - そのセルの中でしか使わない一時変数に向いている
まとめ
Jupyter Notebook の不満(Git diff 問題・再現性問題)を抱えている人にとって、
marimo はかなり有力な選択肢だと感じています。
- Git で扱いやすい
- セルの依存関係が自動管理され、再現性が高い
- UI 付きアプリにもなる
- Python / Markdown / SQL を統合して扱える
今後も使い込みながら、さらに便利な使い方があれば追記していく予定です。
Discussion