2013-12-15 7 views
10

Внутри класса контейнера, когда я хочу перебирать его элементы (или преобразования его элементов, или подмножество его элементов), я могу либо записи генератор (как 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. Какой подход предпочтительнее и почему?

  2. Какой подход создает меньше накладные расходы или имеет другие преимущества Я не могу определить?

ответ

2

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

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

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

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

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

+0

На самом деле понимание генератора в этом случае медленнее. 0.634 с использованием 'f()' и 0.753 с использованием 'g()' –

+0

'g()' эквивалентно 'def h (self): return self.f()' поэтому он не должен быть быстрее, чем просто f () '. Хотя это зависит от того, как реализованы выражения генератора. – jfs

Смежные вопросы