Очевидно, что xrange быстрее, но я понятия не имею, почему он быстрее (и нет никаких доказательств, кроме того, что он раньше был быстрее), или что кроме этого отличается
for i in range(0, 20):
for i in xrange(0, 20):
В Python 2.x:
range
создает список, поэтому, если вы это сделаете, range(1, 10000000)
он создает список в памяти с 9999999
элементами.
xrange
является объектом последовательности, который оценивает лениво.
В Python 3 range
делает эквивалент Python xrange
, и чтобы получить список, вы должны использовать list(range(...))
.
xrange(x).__iter__()
это генератор.i
оценивается по требованию, а не при инициализации.Это правда, но в Python 3
.range()
будет реализован Python 2.xrange()
. Если вам нужно сгенерировать список, вам нужно сделать:источник
xrange
генератора? Это функция, содержащаяyield
оператор, и согласно глоссарию такие функции называются генераторами.Помните, используйте
timeit
модуль, чтобы проверить, какой из небольших фрагментов кода быстрее!Лично я всегда использую
.range()
, если я не имел дело с действительно огромными списками - как вы видите, с точки зрения времени, для списка из миллиона записей дополнительные издержки составляют всего 0,04 секунды. И, как указывает Кори, в Python 3.0.xrange()
он исчезнет и в.range()
любом случае даст вам хорошее поведение итератора.источник
python -m timeit "for i in xrange(1000000):" " pass"
the extra overhead is only 0.04 seconds
это неправильный взгляд на него,(90.5-51.1)/51.1 = 1.771 times slower
он правильный, поскольку он говорит о том, что, если это основной цикл вашей программы, он потенциально может стать узким местом. Однако, если это небольшая часть, то 1,77х - это немного.xrange
сохраняет только параметры диапазона и генерирует числа по запросу. Однако реализация Python на C в настоящее время ограничивает свои аргументы C longs:Обратите внимание, что в Python 3.0 есть только
range
и он ведет себя как 2.x,xrange
но без ограничений на минимальные и максимальные конечные точки.источник
xrange возвращает итератор и одновременно хранит только одно число в памяти. Диапазон хранит весь список чисел в памяти.
источник
xrange
ничего не возвращает итератор.and only keeps one number in memory at a time
и где остальные размещены, пожалуйста,Потратьте некоторое время на Библиотечный справочник . Чем более вы знакомы с ним, тем быстрее вы сможете найти ответы на подобные вопросы. Особенно важны первые несколько глав о встроенных объектах и типах.
Другой способ найти быструю информацию о конструкции Python - это строка документации и функция справки:
источник
Я в шоке, никто не читал док :
источник
Это дает вам два преимущества:
MemoryError
.источник
Вы найдете преимущество
xrange
передrange
этим простым примером:Приведенный выше пример не отражает ничего существенно лучшего в случае
xrange
.Теперь посмотрим на следующий случай, когда
range
он действительно очень медленный по сравнению сxrange
.С помощью
range
он уже создает список от 0 до 100000000 (отнимает много времени), ноxrange
является генератором и генерирует числа только на основе потребности, то есть, если итерация продолжается.В Python-3 реализация
range
функциональности такая же, как иxrange
в Python-2, в то время какxrange
в Python-3 они покончили с этим.Удачного кодирования!
источник
Это из соображений оптимизации.
range () создаст список значений от начала до конца (0 .. 20 в вашем примере). Это станет дорогой операцией на очень больших диапазонах.
С другой стороны, xrange () гораздо более оптимизирован. он будет вычислять следующее значение только при необходимости (через объект последовательности xrange) и не будет создавать список всех значений, таких как range ().
источник
range(x,y)
возвращает список каждого числа между x и y, если вы используетеfor
цикл, тоrange
медленнее. На самом деле,range
имеет больший диапазон индекса.range(x.y)
распечатает список всех чисел между x и yxrange(x,y)
возвращает,xrange(x,y)
но если вы использовалиfor
цикл, тоxrange
быстрее.xrange
имеет меньший диапазон индекса.xrange
будет не только распечатывать,xrange(x,y)
но и сохранять все числа, которые в нем есть.Если вы используете
for
цикл, то это будет работатьПри использовании петель нет большой разницы, хотя есть разница только при печати!
источник
range (): range (1, 10) возвращает список от 1 до 10 чисел и сохраняет весь список в памяти.
xrange (): Подобно range (), но вместо возврата списка возвращает объект, который генерирует числа в диапазоне по требованию. Для цикла это немного быстрее, чем range () и более эффективно использовать память. xrange () объект как итератор и генерирует числа по требованию. (Ленивая оценка)
источник
В некоторых других ответах упоминается, что Python 3 исключил 2.x
range
и переименовал 2.xxrange
вrange
. Однако, если вы не используете 3.0 или 3.1 (что никто не должен делать), это на самом деле несколько другой тип.Как сказано в документах 3.1 :
Тем не менее, в 3.2+,
range
это полная последовательность - она поддерживает расширенные слайсы и все методыcollections.abc.Sequence
с той же семантикой, что и alist
. *И, по крайней мере , в CPython и PyPy (только два 3.2+ реализации , которые в настоящее время существуют), он также имеет реализации постоянная времени проведения
index
иcount
методы иin
оператор ( до тех пор , как вы только передать его целые числа). Это означает, что писать123456 in r
в 3,2+ разумно, а в 2,7 или 3,1 было бы ужасной идеей.* Тот факт, что
issubclass(xrange, collections.Sequence)
возвращаетсяTrue
в 2.6-2.7 и 3.0-3.1, является ошибкой, которая была исправлена в 3.2 и не портирована.источник
В Python 2.x
range (x) возвращает список, созданный в памяти с x элементами.
xrange (x) возвращает объект xrange, который является генератором obj, который генерирует числа по требованию. они вычисляются во время цикла for (Lazy Evaluation).
Для цикла это немного быстрее, чем range () и более эффективно использовать память.
источник
xrange()
не генераторxrange(n)
.__ iter __ () `есть.При тестировании диапазона против xrange в цикле (я знаю, что должен использовать timeit , но это было быстро взломано из памяти с помощью простого примера понимания списка), я обнаружил следующее:
который дает:
Или, используя xrange в цикле for:
Правильно ли тестируется мой фрагмент? Любые комментарии по поводу медленного экземпляра xrange? Или лучший пример :-)
источник
xrange
выглядел немного быстрее, хотя с Python 3 сравнение теперь излишне.timeit
. Он многократно работает, отключает GC, использует лучшие часы вместоtime
и т. Д.xrange () и range () в python работают так же, как и для пользователя, но разница возникает, когда мы говорим о том, как распределяется память при использовании обеих функций.
Когда мы используем range (), мы выделяем память для всех переменных, которые он генерирует, поэтому не рекомендуется использовать с большим значением no. переменных, которые будут сгенерированы.
xrange (), с другой стороны, генерирует только определенное значение за раз и может использоваться только с циклом for для печати всех требуемых значений.
источник
Range генерирует весь список и возвращает его. xrange не делает - генерирует числа в списке по запросу.
источник
xrange использует итератор (генерирует значения на лету), range возвращает список.
источник
Какая?
range
возвращает статический список во время выполнения.xrange
возвращаетobject
(который действует как генератор, хотя, конечно, не один), из которого генерируются значения, как и когда это необходимо.Когда использовать что?
xrange
если вы хотите создать список для гигантского диапазона, скажем, 1 миллиард, особенно если у вас есть «чувствительная к памяти система», такая как мобильный телефон.range
если вы хотите перебрать список несколько раз.PS: Python 3.x в
range
функции == Python 2.x вxrange
функции.источник
xrange
не возвращает объект генератора.Все это очень хорошо объяснили. Но я хотел увидеть это сам. Я использую python3. Итак, я открыл монитор ресурсов (в Windows!) И сначала выполнил следующую команду:
а затем проверил изменения в памяти «В использовании». Это было незначительно. Затем я запустил следующий код:
И это заняло большой кусок памяти для использования, мгновенно. И я был убежден. Вы можете попробовать это для себя.
Если вы используете Python 2X, замените range () на xrange () в первом коде, а list (range ()) на range ().
источник
С помощью документов.
Python 2.7.12
Python 3.5.2
Разница очевидна. В Python 2.x
range
возвращает список,xrange
возвращает объект xrange, который является итеративным.В Python 3.x
range
становитсяxrange
Python 2.x иxrange
удаляется.источник
По требованию к сканированию / печати 0-N предметов, range и xrange работает следующим образом.
range () - создает новый список в памяти, принимает от 0 до N элементов (всего N + 1) и печатает их. xrange () - создает экземпляр итератора, который просматривает элементы и сохраняет в памяти только текущий обнаруженный элемент, следовательно, все время используя один и тот же объем памяти.
Если требуемый элемент находится в начале списка только тогда, он экономит много времени и памяти.
источник
xrange
не создает экземпляр итератора. Он создаетxrange
объект, который является итеративным, но не итератором, почти (но не совсем) последовательностью, подобной списку.Range возвращает список, в то время как xrange возвращает объект xrange, который занимает одну и ту же память независимо от размера диапазона, поскольку в этом случае генерируется только один элемент, и он доступен для каждой итерации, тогда как в случае использования диапазона все элементы генерируются одновременно и доступны в памяти.
источник
Разница уменьшается при меньших аргументах в
range(..)
/xrange(..)
:В этом случае
xrange(100)
только на 20% эффективнее.источник
range: -range заполнит все сразу. Это означает, что каждое число диапазона будет занимать память.
xrange: -xrange - это что-то вроде генератора, он появляется, когда вы хотите диапазон чисел, но вы не хотите, чтобы они были сохранены, например, когда вы хотите использовать эффективную память для loop.so.
источник
Кроме того, если сделать
list(xrange(...))
будет эквивалентноrange(...)
.Так
list
медленно.Также на
xrange
самом деле не полностью закончить последовательностьТак вот почему это не список, это
xrange
объектисточник
range()
в Python2.x
Эта функция по сути является старой
range()
функцией, которая была доступна в Python,2.x
и возвращает экземплярlist
объекта, который содержит элементы в указанном диапазоне.Однако эта реализация слишком неэффективна, когда речь идет об инициализации списка с диапазоном чисел. Например,
for i in range(1000000)
это будет очень дорогая команда для выполнения, как с точки зрения использования памяти, так и времени, так как она требует сохранения этого списка в памяти.range()
в Python3.x
иxrange()
в Python2.x
Python
3.x
представил более новую реализациюrange()
(в то время как более новая реализация уже была доступна в Python2.x
черезxrange()
функцию).Эксплуатирует
range()
стратегию, известную как ленивая оценка. Вместо создания огромного списка элементов в диапазоне, более новая реализация представляет классrange
, легкий объект, который представляет требуемые элементы в данном диапазоне, не сохраняя их явно в памяти (это может звучать как генераторы, но концепция ленивых вычислений заключается в том, что другой).В качестве примера рассмотрим следующее:
а также
источник
Смотрите этот пост, чтобы найти разницу между range и xrange:
Цитировать:
источник
xrange
не является итератором. Список, возвращаемыйrange
функцией действительно поддерживает итерацию (список является в значительной степени прототипом примера итерации). Общая выгодаxrange
не является "минимальной". И так далее.