ジェネレーターは遅延評価されます。関数を評価するには、ジェネレーターを処理する必要があります。collections.deque
ジェネレーターを消費するために使用できます。
import collections
generator = (myClass().Function(thing) for thing in biggerThing)
collections.deque(generator , maxlen=0)
または の使用を検討する@staticmethod
か@classmethod
、またはに変更します
myfunc = myClass().Function
generator = (myfunc(thing) for thing in biggerThing)
collections.deque(generator , maxlen=0)
myClass
処理ごとに作成の新しいインスタンスを減らすためthing
。
更新、パフォーマンス
collections
対iteration
デフ l():
範囲内の x の場合 (100):
y = x**2
利回りy
デフ消費(それ):
その中の私のために:
合格
>>> timeit.timeit('from __main__ import l, consumer; consumer(l())', number=10000)
0.4535369873046875
>>> timeit.timeit('from __main__ import l, collections; collections.deque(l(), 0)', number=10000)
0.24533605575561523
- インスタンス vs クラス vs 静的メソッド
クラステスト(オブジェクト):
@静的メソッド
デフ stat_pow(x):
x**2 を返す
@クラスメソッド
def class_pow(cls, x):
x**2 を返す
def inst_pow(自己、x):
x**2 を返す
def static_gen():
範囲内の x の場合 (100):
yield Test.stat_pow(x)
def class_gen():
範囲内の x の場合 (100):
yield Test.class_pow(x)
デフ inst_gen():
範囲内の x の場合 (100):
yield Test().inst_pow(x)
>>> timeit.timeit('from __main__ import static_gen as f, collections; collections.deque(f(), 0)', number=10000)
0.5983021259307861
>>> timeit.timeit('from __main__ import class_gen as f, collections; collections.deque(f(), 0)', number=10000)
0.6772890090942383
>>> timeit.timeit('from __main__ import inst_gen as f, collections; collections.deque(f(), 0)', number=10000)
0.8273470401763916