クラスの厳しいループでnumpy.random.normal
関数を使用します。
class MyClass(MyBaseClass):
def run(self):
while True:
...
self.L.append(numpy.random.normal(0,1))
Python で複数のルックアップを使用するのはかなり遅いことを私は知っています。にnumpy.random.normal
は 3 つのルックアップがあります。最初にnumpy
がルックアップされ、次に がルックアップされrandom
、次に がルックアップされますnormal
。
numpy.random.normal
そこで、ローカル変数に割り当てることでこの問題に対処することにしました_normal
。
どうぞ:
class MyClass(MyBaseClass):
_normal = numpy.random.normal
def run(self):
while True:
...
self.L.append(MyClass._normal(0,1))
私が本当に心配しているのは記述子です。クラス内の変数がアクセスされると、すべての基底クラスが検索され、同じ名前のデータ記述子が検索されます。ここで説明されています:
属性名を確認
objectname.__class__.__dict__
してください。存在し、データ記述子である場合は、記述子の結果を返します。のすべてのベースでobjectname.__class__
同じケースを検索します。
したがって、_normal
上記のようにローカル空間に入れると、データ記述子のすべての基本クラスが検索されると思います。そして、それが減速の原因になることを警戒しています。
私の懸念は正当なものですか?
基本クラスの記述子を検索するのにかかる時間について心配する必要がありますか?
また、クラスで使用されているときに、モジュールの奥深くにある関数へのアクセスを高速化するより良い方法はありますか?
回答へのコメントで議論がありました。
(私の特定のケースでは) 重要と思われる実装の詳細をいくつか追加することにしました。
実際、コードはこれに近いです (非常に単純化されています)。
class MyClass(MyBaseClass):
def __iter__(self):
return self
def next(self):
self.L.append(numpy.random.normal(0,1))
def run(self):
while True:
self.next()