Ответ 1
В компьютерных науках, когда вы выполняете оптимизацию много раз, вам придется выбирать между скоростью выполнения и использованием памяти, то есть предварительным вычислением чего-либо и его сохранением, или просто выполнением вычислений, когда они вам нужны.
Генератор позволяет вам писать код, который использует foreach для итерации по набору данных без необходимости создавать массив в памяти, что может привести к превышению лимита памяти или значительному времени обработки для генерации
Руководство, вероятно, относится к ситуации, когда вы не будете перебирать все результаты, которые вы генерируете с помощью вашего генератора. В этом случае выигрыш в скорости будет заключаться в том, что вам не нужно тратить время и память на обработку, создавая ненужные вам элементы.
Кроме того, генераторы не были предназначены для замены массивов. Они были предназначены для уменьшения стандартного кода при реализации объектов Iterator.
Генераторы всегда будут медленнее при сравнении их с массивами, потому что генератор должен генерировать значения каждый раз, когда вы вызываете next()
чтобы сохранить память.
редактировать
Мне было немного любопытно, поэтому я сделал быстрое и грязное сравнение между xrange
(реализованным с помощью генераторов, как на странице руководства PHP) и встроенной функцией range
.
Результаты на моей машине (протестировано с PHP 5.6) были:
диапазон (1, 10000000, 1):
time: 5.2702
memory (byte): 1495269376
xrange (1, 10000000, 1):
time: 1.9010
memory (byte): 262144
Обратите внимание, что используемый мной "эталонный" код перебирает все результаты и выполняет простые математические операции. Вызовы функций, как показано выше, служат только для ссылок на значения, с которыми я тестировал. Как всегда, с такими простыми тестами, как YMMV.