Напишите генератор или верните генератор?

Внутри класса контейнера, когда я хочу перебирать его элементы (или преобразования его элементов или подмножества его элементов), я могу либо написать генератор (например, f), либо вернуть генератор (например, g):

class SomeContainer:
    def __init__(self):
        self.data = [1, 'two', 3, 'four']

    def f(self):
        for e in self.data: yield e + e

    def g(self):
        return (e + e for e in self.data)

sc = SomeContainer()
for x in sc.f(): print(x)
for x in sc.g(): print(x)

Мне не нужно передавать информацию в генератор через send.

Очевидно, что оба пути ведут себя одинаково (на поверхности).

  • Какой подход предпочтительнее и почему?

  • Какой подход создает меньше накладные расходы или другие преимущества, которые я не вижу?

Ответ 1

Понимание генератора (например, в g()) будет немного быстрее.

Явные циклы (например, в f()), вероятно, будут более читабельными, если ваша логика будет более сложной, чем в приведенном вами простом примере.

Кроме этого, я не могу представить никаких существенных различий.

Но помните, что они говорят:

Преждевременная оптимизация - это корень всего зла!