Почему этот генератор Fizz Buzz значительно быстрее, чем этот класс Fizz Buzz Iterator?

Узнав о методах и генераторах класса итераторов, я проверил характеристики производительности простых решений 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¾ раз. быстрее , чем класс итераторов.

Снова мой вопрос: почему этот генератор Fizz Buzz значительно быстрее, чем класс Fizz Buzz Iterator?

Класс итератора Fizz Buzz

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 Buzz

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)
10
задан Winny 8 February 2014 в 17:57
поделиться