Ответ 1
Я собираюсь предисловие к этому ответу, сказав, что тайминги в этом масштабе, вероятно, будут трудно точно измерить (возможно, лучше всего использовать timeit
) и что эти виды оптимизации практически никогда не будут иметь никакого значения в вашем фактическое время выполнения программы...
Хорошо, теперь отказ от ответственности...
Первое, что вам нужно заметить, это то, что вы только устанавливаете время для создания объекта generator/xrange. Вы НЕ подсчитываете, сколько времени требуется для фактической итерации значений 1. Есть несколько причин, почему создание генератора может быть быстрее в некоторых случаях, чем создание объекта xrange...
- Для случая генератора вы создаете генератор - никакой код в генераторе не запускается. Это примерно 1 вызов функции.
- Для случая
xrange
вы вызываете эту функцию, а затем вы должны искать глобальное имяxrange
, глобальноеTOTAL
, а затем вам нужно вызвать это встроенное. выполненных в этом случае.
Как для памяти. В обоих ленивых подходах в используемой памяти будет доминировать время выполнения python - не по размеру ваших объектов-генераторов. Единственный случай, когда использование памяти заметно влияет на ваш script, - это случай, когда вы создаете список из 100 миллионов элементов.
Также обратите внимание, что я не могу навсегда подтвердить ваши результаты в моей системе... Используя timeit
, я действительно получаю, что my_xrange
иногда 2 быстрее построить (на ~ 30 %).
Добавьте в нижнюю часть script следующее:
from timeit import timeit
print timeit('my_xrange()', setup='from __main__ import my_xrange')
print timeit('my_sequence()', setup='from __main__ import my_sequence')
И мои результаты (для CPython
на OS-X El-Capitan):
0.227491140366
0.356791973114
Однако pypy
, по-видимому, благоприятствует построению генератора (я сначала попробовал его с my_xrange
first и my_sequence
и получил довольно согласованные результаты, хотя первый для запуска, похоже, был немного отстающим - Возможно, из-за времени прогрева JIT или чего-то еще):
0.00285911560059
0.00137305259705
1 Здесь я бы ожидал, что xrange
будет иметь ребро, но опять же, ничего не будет истинным до тех пор, пока вы timeit
, а затем это будет только true, если разница в таймингах значительна и это верно только на компьютере, где вы выполняли тайминги.
2 См. главу об отказе от ответственности: -P