生成器是惰性求值的。你需要处理生成器以便评估你的函数。可以使用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)
为了减少每个“thing”处理时创建新的myClass
实例。
更新,性能
collections
与iteration
def l():
for x in range(100):
y = x**2
yield y
def consume(it):
for i in it:
pass
>>> timeit.timeit('from __main__ import l, consume; consume(l())', number=10000)
0.4535369873046875
>>> timeit.timeit('from __main__ import l, collections; collections.deque(l(), 0)', number=10000)
0.24533605575561523
- 实例 vs 类 vs 静态方法
class Test(object):
@staticmethod
def stat_pow(x):
return x**2
@classmethod
def class_pow(cls, x):
return x**2
def inst_pow(self, x):
return x**2
def static_gen():
for x in range(100):
yield Test.stat_pow(x)
def class_gen():
for x in range(100):
yield Test.class_pow(x)
def inst_gen():
for x in range(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
这段代码定义了一个Test类和三个生成器函数,分别返回静态方法、类方法和实例方法的平方值。接下来是使用timeit模块测试这些生成器函数的性能。
None
值组成的列表,然后将其丢弃,浪费CPU和内存。 - Martijn Pieters