Xrange python не работает

Почему в Python3 нет функции xrange?

недавно я начал использовать Python3, и это отсутствие xrange болит.

1) вместо python2:

2) Python3:

1) 1.53888392448 2) 3.215819835662842

почему это? Я имею в виду, почему xrange был удален? Это такой отличный инструмент для обучения. Для новичков, как и я, как и мы все были в какой-то момент. Зачем его удалять? Может кто-нибудь указать мне на правильный PEP, я не могу его найти.

6 ответов:

некоторые измерения производительности, используя timeit вместо того, чтобы пытаться сделать это вручную с time .

во-первых, Apple 2.7.2 64-бит:

теперь, python.org 3.3.0 64-разрядная:

видимо, 3.x range действительно немного медленнее, чем 2.x xrange . И ОП xrange функция не имеет к этому никакого отношения. (Не удивительно, как разовый звонок в __iter__ слот вряд ли будет виден среди 10000000 вызовов к тому, что происходит в петля, но кто-то поднял ее как возможность.)

но это только на 30% медленнее. Как ОП стал 2x таким медленным? Ну, если я повторю те же тесты с 32-битным Python, я получаю 1.58 против 3.12. Так что я думаю, что это еще один из тех случаев, когда 3.x был оптимизирован для 64-разрядной производительности таким образом, чтобы повредить 32-разрядную.

но разве это имеет значение? Проверьте это, с 3.3.0 64-бит снова:

Итак, строим list занимает более чем в два раза как долго, чем вся итерация.

а что касается «потребляет гораздо больше ресурсов, чем Python 2.6+», из моих тестов, это выглядит как 3.x range точно такой же размер, как и 2.x xrange -и, даже если бы он был в 10 раз больше, создание ненужного списка по-прежнему составляет около 10000000x больше проблем, чем все, что может сделать итерация диапазона.

а как насчет явного for цикл вместо цикла C внутри deque ?

так, почти столько же времени потрачено впустую в for заявление, как в реальной работе итерации range .

если вы беспокоитесь об оптимизации итерации объекта диапазона, вы, вероятно, ищете не в том месте.

между тем, вы продолжаете спрашивать, почему xrange был удален, независимо от того, сколько раз люди говорят вам одно и то же, но я повторю это снова: он не был удален: он был переименован в range , и 2.x range что было удаленный.

вот некоторые доказательства того, что 3.3

диапазон Python3 — это вместо python2 по. Там нет необходимости, чтобы обернуть итер вокруг него. Чтобы получить реальный список в Python3, вам нужно использовать list(range(. ))

Если вы хотите что-то, что работает с Python2 и Python3, попробуйте это

Python 3’s range тип работает так же, как в Python 2 это xrange . Я не уверен, почему вы видите замедление, так как итератор, возвращаемый xrange функция-это именно то, что вы получите, если вы повторите range напрямую.

Я не могу воспроизвести замедление в моей системе. Вот как я тестировал:

Python 2, с xrange :

в Python 3, с range немного быстрее:

Я недавно узнал что Python 3-х range тип имеет некоторые другие интересные функции, такие как поддержка для нарезки: range(10,100,2)[5:25:5] и range(15, 60, 10) !

Читайте также:  Генератор 12 вольт что может не работать

Источник

Метода xrange() в Python

Метод xrange() доступен только для использования в версиях Python 2.x и используется в циклах для обхода или итерации последовательности.

Основы метода Python xrange()

Метод Python xrange() возвращает объект типа xrange который представляет собой неизменяемую последовательность, обычно используемую для цикла. Эти объекты поддерживают только индексацию, итерацию и функцию len() .

  • start (необязательно) — это начальная точка, с которой начнется создание последовательности. Включен в последовательность и, если не указан, по умолчанию установлен на 0,
  • stop — это номер, перед которым остановится генерация последовательности (исключая),
  • step (необязательно) — это шаговый переход, который функция будет выполнять при генерации или итерации последовательности. По умолчанию он имеет значение 1.

Теперь давайте рассмотрим различные способы использования метода Python xrange() .

1. Только с параметром остановки

Два параметра, step и start являются обязательными, поскольку по умолчанию они имеют значения 1 и 0 соответственно. Следовательно, мы можем использовать метод xrange() просто указав параметр stop .

Когда упоминается только стоп, функция xrange() создает последовательность от 0 до (стоп-1) с шагом 1. Посмотрите на пример ниже.

Здесь тип последовательности, сгенерированной методом, имеет тип xrange как упоминалось ранее. Вывод в список дает нам список, содержащий значения от 0 до 3 (4-1) с шагом 1.

2. С параметрами запуска и остановки

Точно так же мы также можем использовать метод с двумя параметрами. В этом случае по умолчанию step имеет значение 1.

Как видно из вышеприведенного вывода, объект xrange этот раз содержит значения от 2 (начало) до 8 (стоп-1) с шагом по умолчанию 1.

3. Со всеми значениями start, stop и stop.

Когда все параметры упомянуты, функция дает нам объект xrange со значениями в диапазоне от start до stop-1, как это было в предыдущем случае. Но на этот раз переход от одного элемента к другому равен пройденному step .

Внимательно посмотрите на приведенный ниже пример. Здесь мы рассмотрели шаг как 5, start = 5 и, stop = 40.

Из выходных данных видно, что последовательность генерируется со значениями в диапазоне от 5 до 39 (40-1). Для последнего элемента, поскольку 40 превышает отметку stop-1 он не учитывается.

Использование xrange() в циклах

Метод широко используются в for структурах цикла в Python 2. Например , в коде ниже мы пытаемся напечатать таблицу для числа 10.

Здесь мы упомянули start=10 , stop=101 и step=10 . Стоп рассматривался как 101, поскольку мы хотим, чтобы последовательность включала элемент 100 (100-1). Как мы видим, мы получаем все числа, кратные 10, в диапазоне от 10 до 100.

Значит, вывод оправдан.

Сравнение xrange() и range()

Обычно xrange() используется только тогда, когда пользователь хочет, чтобы его код был разработан только для версий Python 2.x, поскольку он недоступен для версий Python 3.x. В Python 3 метод range() заменяет метод xrange() .

Основное различие между этими двумя функциями состоит в том, что они возвращают разные объекты с разными свойствами.

Метод xrange() возвращает объект xrange который является неизменной последовательностью и поддерживает только итерацию, индексацию и функцию len, как упоминалось ранее.

С другой стороны, метод range() возвращает список, который поддерживает основные функции, такие как нарезка, pop() и т. д.

Более того, объекты xrange более полезны, когда нам нужно создать код с минимальной пространственной сложностью, поскольку он требует постоянного размера памяти, независимо от диапазона значений, которые он хранит.

Если вы хотите написать программу, которую можно запускать или выполнять как на Python 2, так и на Python 3, использование метода range() имеет больше смысла и поэтому рекомендуется использовать его.

Читайте также:  Где можно отремонтировать холодильник бош

Источник

NameError: глобальное имя ‘xrange’ не определено в Python 3

Я получаю сообщение об ошибке при запуске программы на Python:

Что вызывает эту ошибку?

7 ответов

Вы пытаетесь запустить кодовую базу Python 2 с Python 3. xrange() был переименован в range() в Python 3 .

Запустите игру с Python 2 вместо. Не пытайтесь портировать его, если вы не знаете, что делаете, скорее всего, будет больше проблем, чем xrange() против range() .

Для записи, что вы видите, это не синтаксическая ошибка, а исключение времени выполнения.

Если вы знаете, что делаете, и активно делаете кодовую базу Python 2 совместимой с Python 3, вы можете связать код, добавив глобальное имя в свой модуль в качестве псевдонима для range . (Учтите, что вам может необходимо обновить любое существующее range() использование в базе кода Python 2 с list(range(. )) , чтобы гарантировать, что вы по-прежнему получаете объект списка в Python 3):

Или замените все случаи использования xrange(. ) на range(. ) в кодовой базе, а затем используйте другую оболочку для обеспечения совместимости синтаксиса Python 3 с Python 2:

Последнее предпочтительнее для кодовых баз, которые хотят быть совместимыми с Python 3 only в долгосрочной перспективе, поэтому проще использовать синтаксис Python 3, когда это возможно.

В python 2.x xrange используется для возврата генератора, а range используется для возврата списка. В python 3.x xrange был удален, а range возвращает генератор точно так же, как xrange в python 2.x. Поэтому в Python 3.x вам нужно использовать range, а не xrange.

Я решил проблему, добавив этот импорт
Дополнительная информация

Я согласен с последним ответом. Но есть и другой способ решения этой проблемы. Вы можете скачать пакет с именем future, например, pip install future.And, в свой файл .py введите это «from past.builtins import xrange» .Этот метод для ситуации, когда в вашем файле много xranges.

Добавить xrange=range в ваш код 🙂 Это работает для меня.

Источник

Почему в Python3 нет функции xrange?

недавно я начал использовать Python3, и это отсутствие xrange болит.

1) вместо python2:

2) Python3:

1) 1.53888392448 2) 3.215819835662842

почему это? Я имею в виду, почему xrange был удален? Это такой отличный инструмент для обучения. Для новичков, как и я, как и мы. все были в какой-то момент. Зачем его снимать? Может кто-нибудь указать мне на правильную бодрость, я не могу ее найти.

6 ответов

некоторые измерения производительности, используя timeit вместо того, чтобы пытаться сделать это вручную с time .

во-первых, Apple 2.7.2 64-бит:

теперь, python.org 3.3.0 64-разрядная версия:

видимо, 3.x range действительно немного медленнее, чем 2.x xrange . И операция

диапазон Python3 is вместо python2 по. Нет необходимости обматывать его вокруг пальца. Чтобы получить реальный список в Python3, вам нужно использовать list(range(. ))

Если вы хотите что-то, что работает с Python2 и Python3, попробуйте это

Python 3’s range тип работает так же, как Python 2 в xrange . Я не уверен, почему вы видите замедление, так как итератор, возвращаемый xrange функция-это именно то, что вы получите, если вы повторите range напрямую.

Я не могу воспроизвести замедление в моей системе. Вот как я тестировал:

Python 2, с xrange :

в Python 3, с range немного быстрее:

Я недавно узнал это Python 3 range тип имеет некоторые другие интересные функции, такие как поддержка для нарезки: range(10,100,2)[5:25:5] is range(15, 60, 10) !

Читайте также:  Почему не работает мышь автобернер

Источник

Why is there no xrange function in Python3?

Recently I started using Python3 and it’s lack of xrange hurts.

The results are, respectively:

Why is that? I mean, why xrange has been removed? It’s such a great tool to learn. For the beginners, just like myself, like we all were at some point. Why remove it? Can somebody point me to the proper PEP, I can’t find it.

6 Answers 6

Some performance measurements, using timeit instead of trying to do it manually with time .

First, Apple 2.7.2 64-bit:

Now, python.org 3.3.0 64-bit:

Apparently, 3.x range really is a bit slower than 2.x xrange . And the OP’s xrange function has nothing to do with it. (Not surprising, as a one-time call to the __iter__ slot isn’t likely to be visible among 10000000 calls to whatever happens in the loop, but someone brought it up as a possibility.)

But it’s only 30% slower. How did the OP get 2x as slow? Well, if I repeat the same tests with 32-bit Python, I get 1.58 vs. 3.12. So my guess is that this is yet another of those cases where 3.x has been optimized for 64-bit performance in ways that hurt 32-bit.

But does it really matter? Check this out, with 3.3.0 64-bit again:

So, building the list takes more than twice as long than the entire iteration.

And as for «consumes much more resources than Python 2.6+», from my tests, it looks like a 3.x range is exactly the same size as a 2.x xrange —and, even if it were 10x as big, building the unnecessary list is still about 10000000x more of a problem than anything the range iteration could possibly do.

And what about an explicit for loop instead of the C loop inside deque ?

So, almost as much time wasted in the for statement as in the actual work of iterating the range .

If you’re worried about optimizing the iteration of a range object, you’re probably looking in the wrong place.

Meanwhile, you keep asking why xrange was removed, no matter how many times people tell you the same thing, but I’ll repeat it again: It was not removed: it was renamed to range , and the 2.x range is what was removed.

Here’s some proof that the 3.3 range object is a direct descendant of the 2.x xrange object (and not of the 2.x range function): the source to 3.3 range and 2.7 xrange . You can even see the change history (linked to, I believe, the change that replaced the last instance of the string «xrange» anywhere in the file).

So, why is it slower?

Well, for one, they’ve added a lot of new features. For another, they’ve done all kinds of changes all over the place (especially inside iteration) that have minor side effects. And there’d been a lot of work to dramatically optimize various important cases, even if it sometimes slightly pessimizes less important cases. Add this all up, and I’m not surprised that iterating a range as fast as possible is now a bit slower. It’s one of those less-important cases that nobody would ever care enough to focus on. No one is likely to ever have a real-life use case where this performance difference is the hotspot in their code.

Источник

Оцените статью