Diary?

2009-11-10
Tue

(11:55)

……メモ化使え、以上(ってコメントでも突っ込まれてるか)。ま、とりあえずシンプルな実装例でも出しておくか。

class memoize(object):
    def __init__(self, f):
        self.__function = f
        self.__cache = {}
    
    def __call__(self, *args):
        if args in self.__cache:
            return self.__cache[args]
        else:
            self.__cache[args] = self.__function(*args)
            return self.__cache[args]
    
    def clear(self):
        self.__cache.clear()
    
@memoize
def get():
    data = open('config.yaml').read().decode('utf8')
    config = yaml.load(data)
    return config

俺がこちらの方が望ましい理由と考える理由を以下に述べる。

  • 一般的に global 宣言を使うのは好ましいプログラミングスタイルではない
  • こんな大したことない処理に対してプロファイル取らずに最適化かけるのはバカらしい
    • if 文の実行コストが気になるような状況では、そもそも関数呼び出しのコストが先に問題になるので、いちいち気にしてたらキリがない
      • あるいは設定ファイルの内容なんてものが彼方此方から何度も参照されるのはおかしい
  • 「config.yaml が実行中に変化しない」という前提がそもそも怪しく、キャッシュのクリアがあった方が後々楽になる

しかしクロージャの使用の有無に関わらず global が出てくる時点で何か変とは思わんかったのか。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。