2015年12月25日

lazy import 1

プログラムの起動を早くするためのテクニック lazy import を紹介します。


以下のようなソースコードがあったとします。

import urllib.request  # 冒頭でimport

def cat(filename):
    if filename.startswith('http://'):
        print(urllib.request.urlopen(filename).read())
    else:
        print(open(filename).read())
上で定義された cat() は、指定されたファイル名のファイルの内容を出力することを目的としています。追加の便利機能として、指定されたファイル名が URL である場合には、その URL のデータを出力します。
ここで、cat() の本来の目的はファイルの内容の出力であり、引数に URL が指定されることは滅多にない、とします。

この cat() が定義されたファイルを実行又は import すると、1行目で import urllib.request が実施されます。しかし、ここで import した urllib.request は結局は使われないことの方が多いということが分かっています。ということは、import に掛かった時間が丸々無駄になってしまう可能性が高いです。

この無駄な import を回避する手段を lazy import と言います(あえて日本語にすると「遅延import」と言った所でしょうか)。
やり方は簡単で、そのモジュールが必要となる直前に import を実施します。
cat() に lazy import を適用すると以下のようになります。

def cat(filename):
    if filename.startswith('http://'):
        import urllib.request  # ここでimport
        print(urllib.request.urlopen(filename).read())
    else:
        print(open(filename).read())


lazy import が効果的となるのは、プログラムの起動が頻繁に行われる場合です。
一度起動したらPCの電源が切れるまで動き続けるようなプログラムでは、それほど意味はありません。本当に起動が少し早くなるだけです。
逆に、短い周期で頻繁に起動されるプログラムであれば(操作の度に subprocess から呼ばれる、など)、その効果は大となります。

0 件のコメント:

コメントを投稿