Python importテクニック

Pythonのimportのここが凄い

Pythonのimportは結構特殊というかフレキシブルな構造をしている。他の言語の類似機能だと必ず最初に宣言する必要があるが、Pythonの場合はそのような配慮は全く不要で、何処でも書けてしまう。また、書いた所でimport処理が実行される。従って、場合によってはimport書いておきながら、結果的にimportしないようなコードがあっさり書ける。

つまり

こういう書き方ができる

...

if __name__ == "__main__":
    import hoge

テスト実行のときだけimportするとか!

def fuga():
    import hoge

特定関数を実行する時だけimportするとか!

何が凄いの

importするとかなりコストが重いライブラリというのは往々にして存在していて、私のTerminatterの場合だとpynotifyというライブラリのインポートがGTKのコードもimportしてて、大体0.5秒ぐらい掛かる。

大したこと無いじゃんと思うかもしれないが、投稿毎にPythonスクリプトを立ち上げるTerminatterにとって割と無視できない時間になる。

しかし現実問題として、pynotifyが使われる所は極めて限られていて、全く使われないことも多い。従って上記の解決方法を用いることによって劇的にレスポンスタイムを縮小できる、という訳だ。

また、GTKのロードは他にも問題があって、例えばGTKの入ってないサーバマシンとかだと、余計なエラーコードを表示して鬱陶しいという問題もあって、それも解決できる。

懸念事項

頻繁にループが回っている所でimportした場合、その度にimportして大幅なロスになるんじゃないの、という疑惑を解消する為に、単純ではあるが以下のようなコードを書いてみた

for i in xragnge(10000):
    import pynotify
    print "OK"

実行してみたら、最初のOKまで待たされたが、次以降はNoWaitで処理できた。includeガードによる恩恵だと思われる。全くのNoCostとは思えないが、ほぼ無視して良いレベルだと思われる。

ぽんこつさんとのお約束

とはいえ分かり辛くなる可能性が高いから濫用はするなよ!