2010年11月19日金曜日

Pythonのシングルトン

httpレスポンス作成で、htmlテンプレートを毎回生成するのが微妙なので、
シングルトンについて調べてみる。

hasatttrは遅そうなので、try~exceptで例外をキャッチする方法にしたところ、10%高速になった。

class Singleton(object):
    def __new__(cls, *args, **kwds):
        try:
            return cls.__instance
        except AttributeError: 
            instance = super(Singleton, cls).__new__(cls, *args, **kwds)
            cls.__instance = instance
        return instance

そのままだと、__init__(self, *vals, **kwds)が、毎回呼ばれてしまうので、
__init__を上書きする処理を追記。
さらに、__slots__ = ()を入れて、1%高速化。


class Singleton(object):
    __slots__ = ()
    @staticmethod
    def _nodo(self,*args, **kwds):
        pass
    def __new__(cls, *args, **kwds):
        try:
            return cls.__instance
        except AttributeError: 
            instance = super(Singleton, cls).__new__(cls, *args, **kwds)
            cls.__instance = instance
            cls.__init__(instance, *args, **kwds)
            cls.__init__ = Singleton._nodo
        return instance 

0 件のコメント:

コメントを投稿