在学习了迭代器类方法和生成器之后,我使用以下每个成语测试了简单Fizz Buzz解决方案的性能特性:
>>> from timeit import timeit
>>> timeit('tuple(fizzbuzz.FizzBuzzIterator(10))', 'import fizzbuzz')
13.281935930252075
>>> timeit('tuple(fizzbuzz.fizz_buzz_generator(10))', 'import fizzbuzz')
7.619534015655518根据timeit,生成器函数大约比迭代器类快1倍于1。
我的问题是:为什么这个Fizz Buzz生成器比这个Fizz Buzz Iterator类要快得多?
Fizz迭代器类
class FizzBuzzIterator:
def __init__(self, low, high=None):
if high is None:
self.high = low
self.current = 1
else:
self.high = high
self.current = max(low, 1)
def __iter__(self):
return self
def next(self):
if self.current > self.high:
raise StopIteration
else:
c = self.current
self.current += 1
if (c % 5 + c % 3) == 0:
return 'FizzBuzz'
elif c % 5 == 0:
return 'Buzz'
elif c % 3 == 0:
return 'Fizz'
else:
return str(c)Fizz发生器函数
def fizz_buzz_generator(low, high=None):
if high is None:
high = low
cur = 1
else:
cur = max(low, 1)
while cur <= high:
c = cur
cur += 1
if (c % 5 + c % 3) == 0:
yield 'FizzBuzz'
elif c % 5 == 0:
yield 'Buzz'
elif c % 3 == 0:
yield 'Fizz'
else:
yield str(c)发布于 2014-02-08 18:24:26
因为显然,生成器比迭代器的实现效率更高。
第一个解决方案具有以下有趣的特性:
第二个解决方案不执行这些操作,而是使用yield,这意味着语言运行库执行繁重的任务。由于运行时通常是用C实现的,这可以比第一个解决方案的非常高级别的代码更优化。
接下来,你应该考虑一下你实际上在做的是什么。对于一个好的基准测试,您应该选择不同的输入大小n,并观察这两种解决方案如何在不同的尺度上进行比较。
https://stackoverflow.com/questions/21650038
复制相似问题