Объекты типа xrange

Когда я читаю ссылку на xrange, она говорит вот так...

Объекты типа xrange похожи на буферы в том смысле, что для их создания нет специального синтаксиса, но они создаются с помощью функции xrange(). Они не поддерживают нарезку, конкатенацию или повторение, и использование in, а не in, min() или max() для них неэффективно.

Тем не менее, пока я видел, все xrange(), которые я использовал, с in. for x in xrange(10): do somethings..

Так почему он говорит, что этот путь неэффективен? Так какой же должен быть правильный способ использования xrange?

2 ответа

Цитирование Советы по производительности:

xrange является генератором объекта, в основном эквивалентным следующему коду Python 2.3:

def xrange(start, stop=None, step=1):
    if stop is None:
        stop = start
        start = 0
    else:
        stop = int(stop)
    start = int(start)
    step = int(step)

    while start < stop:
        yield start
        start += step

За исключением того, что это реализовано в чистом C.

Они говорят, что in неэффективен на xrange объекты, потому что in пытается перебрать объект, если __contains__Подход не удался. Из деталей теста членства:

Для классов, которые не определяют__contains__() но определите__iter__(), x in y верно, если какое-то значение zс x == z производится во время перебора y,

xrangeне реализует__contains__и для того, чтобы "найти" элемент N вxrange(N + 1)in Оператор должен выполнить N итераций так

N in xrange(N + 1)

логически эквивалентно

for n in xrange(N + 1):
    if n == N:
        break

и это не эффективно.

not inнеэффективно, потому чтоinнеэффективно.

Обратите внимание, что производительностьinоператордля испытаний на герметичность не влияет на производительность forпетля. Это 2 разные вещи.

На самом деле,"in"в правиле грамматики для for петля (показано ниже)

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

исправлен и не является оператором.

Нет, они на самом деле имели в виду

>>> 5 in xrange(0, 10)
True

который является тестом для "содержит". Это неэффективно, поскольку в худшем случае оно должно проходить через все элементы.

Это не про for петля, которая является правильной и эффективной. Я полагаю, что документ немного вводит в заблуждение.

Другие вопросы по тегам