Объекты типа 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
петля, которая является правильной и эффективной. Я полагаю, что документ немного вводит в заблуждение.