Очень маленький пост о том, что выбрать: генератор или класс, когда реализация возможна обеими способами.
Не сложный выбор
Простая задача: рассчитывать скользящее среднее. Первоначальная реализация была в виде класса, но не давало покоя наличие генераторов, которые как-то очень подходили под концепцию. Но простой тест помог сделать выбор.
class EMA(object):
def __init__(self, alpha=0.5):
self.value = 0
self.alpha = alpha
def update(self, price):
self.value = self.value + self.alpha * (price - self.value)
def ema(alpha=0.5):
result = None
previous = (yield)
while True:
price = (yield result)
result = result + alpha(price - result)
Теперь проводим 2 замера: создаём миллион генераторов и миллион классов, исследуем время и память:
Реализация | Память | Время |
Генераторы | 433,012 Мб | 0:00:02.330000 |
Классы | 200,504 Мб | 0:00:01.807000 |
Вывод: классы в Python сделаны очень легковесными. Используйте их смело.
P.S. Под дебаггером классы создавались более 6 секунд, а время создания генераторов увеличилось всего на 1 секунду. Не проводите замер под отладчиком.
Автор: deko