インポートフック:ソースコードを書き換えずに FireDucks を使う方法のご紹介

インポートフック機能を使えばソースコードを1行も書き換えずに FireDucks を使えるようにすることができます

FireDucks 開発チームの大道です.今日は開発者ブログとして,FireDucks に備わっているインポートフック機能をご紹介したいと思います.この機能を使えば,お手持ちのソースコードを1行も書き換えることなく FireDucks を使うことができるようになります.

コマンドラインから Python ファイルを実行する際の使い方と,IPython や Jupyter Notebook での使い方を見ていきましょう.

インポートフックとは?

FireDucks はオリジナルの pandas と同じように振る舞うため,インポート文を以下のように書き換えるだけで簡単に使い始めることができます.

# import pandas as pd
import fireducks.pandas as pd

しかしたかが1行書き換えるだけとはいえ,今まで作成してきたプログラムで pandas を使用している部分を探して全部 FireDucks に置き換えるのは,意外と面倒くさいものです.また,pandas と連携するサードパーティライブラリでも FireDucks を使用したい場合,そのライブラリの中にまで手を入れて import pandas を書き換える作業は,普通はしたくないでしょう.

Get Started でも触れられている通り,FireDucks にはインポートフックというユーティリティが含まれています.コマンドラインで your_script.py を実行する際に,Python インタープリターに以下のようにオプションを指定してください.

python3 -m fireducks.imhook your_script.py

以上のようにして起動すると,pandas をインポートしようとしたら代わりに fireducks.pandas がインポートされるようになります.これは your_script.py のソースコードを編集しているわけではなく,プログラムを実行しながら動的にインポート処理に割り込んでいます.

インポートフックの動作例

以下のような簡単な Python スクリプト print_classname.py で動作を確認してみましょう.このスクリプトでは DataFrame クラスの repr 表現が出力されます.

import pandas as pd
print(pd.DataFrame)

普通に実行すると以下のような出力ですが….

$ python3 print_classname.py
<class 'pandas.core.frame.DataFrame'>

インポートフック機能を使って実行すると以下のような出力に変わります! 🥳

$ python3 -m fireducks.imhook print_classname.py
<class 'fireducks.pandas.frame.DataFrame'>

ソースコードを編集していないのに FireDucks のデータフレームが使えるようになっていることがわかります.

制限事項

shebang 未対応

現在のところ,shebang (#!...) による実行には対応していません.

#!/usr/bin/python3
import pandas as pd
print(pd.DataFrame)

Python インタープリターに -m オプションを指定できないため,インポートフックを有効化できません(そりゃそうだ).

$ chmod +x print_classname_shebang.py
$ ./print_classname_shebang.py
<class 'pandas.core.frame.DataFrame'>

他のモジュール実行オプションとの同時指定不可

Python インタープリターの起動時には -m オプションはひとつしか指定できないため,-m オプションを使って起動する他のツールと同時に使うことはできません.

サブプロセス非対応

subprocess モジュールを使って Python プロセスを新たに起動した場合,そのサブプロセスにインポートフックの設定は受け継がれません.

Jupyter Notebook での使い方

インポートフックは Jupyter Notebook でも利用することができます.ただし現在のところ,Jupyter を起動する際のオプションとしては利用できず,ノートブックの最初のセルで明示的に有効化する必要があります.

import fireducks.importhook
fireducks.importhook.activate_hook("fireducks.pandas", "pandas")

自分で書いたノートブック内で pandas をインポートするだけならインポートフックを使うメリットはあまりないかもしれません.しかし,pandas と連携するようなサードパーティライブラリの中ででもインポートフックは働くため,そのようなライブラリをノートブックから使用する場合に便利です.

無効化する場合は以下の関数を実行してください.

fireducks.importhook.deactivate_hook()

ただし,オリジナルの pandas のデータフレームと FireDucks のデータフレームを混ぜて使うと(恐らく複雑怪奇なエラーメッセージとともに)エラーが発生します.基本的には一度インポートフックを有効化したら有効化しっぱなしにしておきましょう.

IPython CLI での起動方法

IPython の場合,先述した Jupyter Notebook での使い方と同じように手動で有効化してもいいのですが,bash などでは以下のようにして IPython CLI を起動することもできます.

python3 -m fireducks.imhook "$(which ipython)"

うーん…,ちょっと無理矢理ですね!

まとめにかえて

FireDucks はまだまだ研究開発中のソフトウェアで,pandas で動いていたプログラムで FireDucks を使うように変更しても,エラーになってしまって動かない部分があるかもしれません.私たち FireDucks 開発チームではベータ版を公開してからも日々機能改善に取り組んでおり,エラー報告など,皆さんからのフィードバックをお待ちしております.連絡先はこちらを参照してください.

以上,ソースコードを1行も書き換えずに FireDucks を使う方法のご紹介でした.FireDucks を使ってみたいと思った方は Get Startedユーザーガイド,pandas との速度比較が気になる方はベンチマークも読んでみてくださいね.

May the Acceleration be with you, FireDucks 開発チーム