Jupyter Notebook/Lab, VS Code & Colabの編集性能を比較する

## はじめに

突然ですが、ipynb（いわゆるnotebook形式のファイル）って便利ですよね。一枚のページにコードも図表もMarkdownテキストもまとめて載せられるツールは他になかなかないので、データ分析などのタスクで広く使われている印象があります。

自分もこのごろ頻繁にipynbを使うようになったのですが、その編集ツールをいろいろ試していると利点も欠点も様々なことが分かってきました。そこで、簡単にまとめを書いてみたいと思います。

比較するのは定番のJupyter Notebook、Notebookの後継であるJupyterLab、Microsoft謹製のVisual Studio Code、それからGoogle Collaboratoryです。

## 2022/05/25 追記

以下の内容は2年ほど前に行った比較を元にしていますが、それから現在までにいろいろと気づいた点があり、個人的に使うツールが変わったので、まずその点について少し書いておきます。

読んでいただくと分かる通り当時はJupyterLabが好きでしたが、現在はほぼVS Code（および拡張機能Python）のみを使っています。VS Codeの方が動作が速く安定していることが大きな理由です。

その背景として、VS Codeは開発コミュニティがアクティブで細かい不具合も比較的速く解消される印象があります。以下に書いていたショートカットの問題も、だいぶ前に解消されたようです。

また、VS Codeはスニペットの設定、Python関連拡張機能の追加など、Pythonコーディングの環境を細かく改善できるポイントが多々あるという点でも有利かなと思います。

## 環境

- macOS

## Jupyter Notebook

Jupyter Notebook（以下Notebook）は2011年から開発されている開発環境で、最近でも書籍などでよく紹介されています。

しかしJupyterの[公式ページ](https://jupyter.org/)でJupyterLabの方が上に来ていることからも分かるように、Notebookは今やJupyterのメイン・プロダクトではなくなってきているようです。実際、以下で説明するように機能面で比べてみてもNotebookが見劣りする場合が多くあります。

なので、今から使い始めるのであれば基本は次に紹介するLabの方がいいかなと思いますが、一つだけ利点を挙げてみます。

### 拡張機能が豊富

以下の記事でも紹介されているようにNotebookには拡張機能が多くありますが、まだその全てがLabでも使える状態にはなっていないようです。そのため、Notebookの方でしか使えない拡張機能がある場合は、そちらを選ぶのもありかと思います。

[[作業効率化] Jupyterの拡張機能を全部調べてみた - Qiita](https://qiita.com/simonritchie/items/88161c806197a0b84174)

## JupyterLab

さて、それではJupyterLab（以下Lab）とは何かですが、Jupyterの[公式ページ](https://jupyter.org/)で

> Jupyter’s Next-Generation Notebook Interface

とされているとおり次世代のipynb編集ツールとして必要な機能を揃えた開発環境で、以下のような利点を持っています。

### 画面を分割できる

タブの見出しを右クリックして「New View for Notebook」とすると、同じファイルを2つの画面で見られます。長いファイルの上の方を見ながら下の方を書きたいときなどに便利です。

![lab1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/8a71aaa1-08f9-d1f3-e401-94f6a2a54ea3.gif)

### セルの移動ができる

移動については、ドラッグ＆ドロップで簡単にセルを動かせます。上で触れた画面分割機能と組み合わせて使うと、あるセルを別のファイルにコピーしたり、ファイルの一番下にあるセルを一番上に持ってきたり、といったことも楽にできます。

![lab2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/f2c0743c-a72c-d9ca-c613-15c72221a5b0.gif)

### セルの結合・分割ができる

結合と分割もコマンドひとつで簡単に実行できます。個人的には、外部からテキストやコードを貼り付けてきたとき、その途中の状態を確認したい場合などによくセルの分割を使っています。

![lab3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/7f59769c-a885-b74e-69c5-8b83fab46e8e.gif)

（GIF画像内で`?`マークが出ている箇所では`shift ↓`と入力しています）

### TOCなどの拡張機能が使える

先ほどNotebookでしか使えない拡張機能があるらしいということを書きましたが、Labにも十分な種類の拡張機能があります。

自分が重宝しているのはTOC（Table of Contents）というもので、Markdownが書かれたセルに目次をつけてファイル内の上下移動をやりやすくしてくれます。これは、特にファイルが長くなったとき便利。

以下に、公式の[GitHubページ](https://github.com/jupyterlab/jupyterlab-toc)から借りてきた画像も貼っておきます。

![toc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/c9e73243-6719-a939-0ad1-6a3be94a745c.gif)

### 手軽にドキュメントや変数の中身を確認できる

`shift + tab`で各種のメソッドやプロパティについてドキュメントを閲覧できるため、手軽に引数の渡し方を確認したいときなどに便利です。同じコマンドで、変数の値や型を確認することもできます。

![lab4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/f920ed28-94eb-b276-cdec-37db41b464f2.gif)

（GIF画像内で`|<-`のようなマークが出ている箇所では`shift tab`と入力しています）

### 導入も簡単

以下のリンクなどを参考にすれば、割と簡単に使い始められるかと思います。

[JupyterLabのすゝめ - Qiita](https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c#3-jupyterlab%E3%81%AE%E5%B0%8E%E5%85%A5)

### 起動に手間がかかる

最後にLabのデメリットとその対策を一点。これはNotebookも同様ですが、起動するときターミナルで`jupyter lab`と打って少し待たなければいけない面倒さがあります。これはLabを使う機会が増えてくるとイライラの原因になったりするのですが、`jupyter lab`の代わりに`jl`と打てばいいようにalias（下記参照）を設定しておくことなどにより緩和できます。

[【初心者向け】エイリアスの設定方法 - Qiita](https://qiita.com/yutat93/items/b5bb9c0366f21bcbea62)
[zshにエイリアスとかいう奴入れたら人生の時間がn秒増えて神 - Qiita](https://qiita.com/Ancient_Scapes/items/abfb0673aa5df3274fc6)

## Vidual Studio Code

<img width="1136" alt="vscode1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/34c66c03-17d9-ed2d-6bfb-70a87942416e.png">

Visual Studio Code（以下VS Code）は、Pythonに限らず様々な言語のコーディングで使われる人気の統合開発環境で、たとえばStack Overflowによる最近の[Most Popular Development Environmentsランキング](https://insights.stackoverflow.com/survey/2019#technology-_-most-popular-development-environments)でも抜群に高いポイントを獲得しています。

そんなVS Codeでipynbを編集するにはどうすればいいかというと、詳しくは以下の記事などを参照いただきたいのですが、基本的には[Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)という拡張機能を入れればOKです。そうしてできた開発環境では、次のようなメリットが得られます。

[Visual Studio CodeでJupyter Notebookを動かしてみた | Developers.IO](https://dev.classmethod.jp/articles/visual-studio-code-jupyter-notebook/)

### セルの移動ができる

セルの左にあるボタンを押すことで、一つ上あるいは一つ下にセルを移動できます。ただ、JupyterLabのようにセルの結合や分割まではできないようです。

### マルチカーソルなど高度な編集機能

このあたりはさすがVS Codeという感じですが、上または下へのカーソル追加（`command + option + ↑/↓`）や複数文字列の選択（`command + D`）などの便利機能が使えます。コードの細かい編集をたくさんしなければいけないときは、こういった機能を活用すると効率化できるのではないでしょうか。

### ファインダーからワンタッチで開ける

ファインダーで「情報を見る」から「このアプリケーションで開く」のメニューをVS Codeに設定しておくと、他の一般的なファイルと同じようにダブルクリックでipynbを開けるようになります。他の人が作ったファイルをざっと見たいときなどは便利です。

<img width="718" alt="lab1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/517c24dc-ee40-5dd9-1ffa-dec6ceb51e81.png">

### 高速・的確な入力予測

入力したそばから次に打つ文字の予測を出してくれるので、タイプする文量を減らせます。Labにも入力予測がないわけではないのですが、tabキーを押して少し待たないといけないので、VS Codeの方がやや使いやすい印象があります。

### 仮想環境の中で簡単に開ける

[Remote Container](https://code.visualstudio.com/docs/remote/containers)という拡張機能を使うと、Dockerのコンテナ内でも手軽にipynbを編集できます。VS Codeではもともと``control + ` ``のワンタッチでターミナルを開閉できますが、このあたりも組み合わせると仮想環境の中でも諸々の操作がサクサクこなせるかと思います。

### ~~ショートカットの挙動に難あり~~

~~以上のような利点を持つVS Codeですが、macOSの標準的なショートカットが場合により使えないという短所があります。具体的には、たとえばipynbを開いたタブにフォーカスが当たっているあいだは`command + M`でウィンドウを最小化する操作ができなかったりします。~~

## Google Colaboratory

<img width="1072" alt="colab1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229718/5f712720-c62a-1075-258c-142f0aa2f094.png">

Google Collaboratory（以下Colab）は、その名のとおりGoogleが提供している開発環境です（紹介ページは[こちら](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)）。

### Googleの計算リソースが使える

Colabが持つ最大のメリットは豊富な計算リソースを無料で使えることかと思います。

機械学習などで重い処理をしたい場面ではローカル環境でコードを実行したくないこともあるかと思いますが、そうしたとき外部に処理を投げられるのはメリットになるのではないでしょうか。ディレクトリの構成などはMacのローカル環境と勝手が違うので慣れが必要ですが、使いこなせれば有効な武器になりそうです。

### 高度な編集機能

以下の記事などが分かりやすいですが、Colabにはコードを編集するための便利なショートカットがいろいろ用意されています。

[Google Colaboratory コマンド チートシート【jupyter対応】 - Qiita](https://qiita.com/Intel0tw5727/items/7cc68734edd568357a9e)

VS Codeと同様に、上または下へのカーソル追加（`command + option + ↑/↓`）や複数文字列の選択（`command + D`）もできるようです。すごい。

### 共有について

自分が最初にColabの存在を知ったときはGoogleのサービスなので（同社のドキュメントやスプレッドシートのように）、複数のメンバーが入力した内容をクラウド経由で即座に共有できるのではと期待したのですが、そういったことはできないようです。

とはいえ、Google Drive上の共有フォルダにipynbファイルを置いておいて他のメンバーが自由にそれを閲覧できるように設定することは可能で、こういった部分ではやはりGoogleのお世話になるのもいいと思います（自分はLabでGoogle DriveやDropbox上のipynbを編集する、ということをよくやります）。

## まとめ

さていろいろと書いてきましたが、2020年9月現在では「基本的にJupyterLab、ざっと確認したいときはVS Code、外部の計算リソースが要るときはColab」といった使い分けがよさそう、というのが個人的なまとめです。VS CodeやColabにはそれぞれ強みがありますが、高速な入力予測や大量の計算リソースが必要な場合を除いて、セルの結合・分割などがサクサクできるJupyterLabが最も使いやすいのではないでしょうか。

以上、一部JupyterLabの布教っぽい記事なってしまいましたが、他にも「これにはこんな使い方もあるよ」とか「それはこうすればもっと便利に使えるのに」などあればぜひ教えてください🙇‍♂️

## 編集ログ

2020/04/29：Colabの編集機能などについて追記しました。

2020/10/01：JupyterLabでドキュメントや変数の中身を見る方法などについて追記しました。

2022/05/25：VS Code（および拡張機能Python）が改善された件について追記しました。

## 補足

サンプルの画像として使った正規表現の問題については[こちら](https://qiita.com/Yusuke196/items/47203be382f60d653da7)。