Aparentemente, o xrange é mais rápido, mas não tenho idéia do porquê é mais rápido (e não há provas além da anedótica até agora que é mais rápida) ou o que além disso é diferente.
for i in range(0, 20):
for i in xrange(0, 20):
No Python 2.x:
range
cria uma lista; portanto, se você fizer range(1, 10000000)
isso, cria uma lista na memória com 9999999
elementos.
xrange
é um objeto de sequência que avalia preguiçosamente.
No Python 3, range
faz o equivalente ao python xrange
e, para obter a lista, você precisa usar list(range(...))
.
xrange(x).__iter__()
é um gerador.i
é avaliado sob demanda e não na inicialização.Isso é verdade, mas no Python 3,
.range()
será implementado pelo Python 2.xrange()
. Se você realmente deseja gerar a lista, precisará:fonte
xrange
um gerador? É uma função que contémyield
instrução e, de acordo com o glossário, tais funções são chamadas de geradores.Lembre-se, use o
timeit
módulo para testar qual dos pequenos trechos de código é mais rápido!Pessoalmente, eu sempre uso
.range()
, a menos que eu esteja lidando com listas realmente grandes - como você pode ver, em termos de tempo, para uma lista de um milhão de entradas, a sobrecarga extra é de apenas 0,04 segundos. E, como aponta Corey, no Python 3.0.xrange()
desaparecerá e.range()
fornecerá um bom comportamento do iterador de qualquer maneira.fonte
python -m timeit "for i in xrange(1000000):" " pass"
the extra overhead is only 0.04 seconds
não é a maneira correta de ver isso,(90.5-51.1)/51.1 = 1.771 times slower
é correta porque indica que, se esse é o loop principal do seu programa, ele pode potencialmente estrangulá-lo. No entanto, se essa é uma parte pequena, 1,77x não é muito.xrange
armazena apenas os parâmetros do intervalo e gera os números sob demanda. No entanto, a implementação C do Python atualmente restringe seus argumentos a C longs:Observe que no Python 3.0 existe apenas
range
e ele se comporta como o 2.x,xrange
mas sem as limitações nos pontos finais mínimos e máximos.fonte
O xrange retorna um iterador e mantém apenas um número na memória por vez. O intervalo mantém toda a lista de números na memória.
fonte
xrange
se não retornar um iterador.and only keeps one number in memory at a time
e onde o resto são colocados por favor me orientar ..Passe algum tempo com a Referência da biblioteca . Quanto mais familiarizado, mais rápido você encontrará respostas para perguntas como essa. Especialmente importantes são os primeiros capítulos sobre objetos e tipos incorporados.
Outra maneira de encontrar informações rápidas sobre uma construção Python é a docstring e a função de ajuda:
fonte
Estou chocado que ninguém leu doc :
fonte
Isso traz duas vantagens:
MemoryError
.fonte
Você encontrará a vantagem de
xrange
terminarrange
neste exemplo simples:O exemplo acima não reflete nada substancialmente melhor em caso de
xrange
.Agora, observe o seguinte caso em que
range
é realmente muito lento, em comparação comxrange
.Com
range
, ele já cria uma lista de 0 a 100000000 (demorada), masxrange
é um gerador e gera apenas números com base na necessidade, ou seja, se a iteração continuar.No Python-3, a implementação da
range
funcionalidade é igual à doxrange
Python-2, enquanto eles acabaram com oxrange
Python-3Feliz codificação !!
fonte
É por razões de otimização.
range () criará uma lista de valores do início ao fim (0 .. 20 no seu exemplo). Isso se tornará uma operação cara em faixas muito grandes.
xrange () por outro lado, é muito mais otimizado. ele calculará apenas o próximo valor quando necessário (por meio de um objeto de sequência xrange) e não cria uma lista de todos os valores, como range ().
fonte
range(x,y)
retorna uma lista de cada número entre x e y, se você usar umfor
loop,range
é mais lento. De fato,range
possui uma faixa maior de índice.range(x.y)
imprimirá uma lista de todos os números entre x e yxrange(x,y)
retorna,xrange(x,y)
mas se você usou umfor
loop, entãoxrange
é mais rápido.xrange
tem um intervalo menor de índice.xrange
não apenas será impresso,xrange(x,y)
mas também manterá todos os números contidos nele.Se você usar um
for
loop, funcionariaNão há muita diferença ao usar loops, embora exista uma diferença ao apenas imprimi-lo!
fonte
range (): range (1, 10) retorna uma lista de 1 a 10 números e mantém a lista inteira na memória.
xrange (): como range (), mas em vez de retornar uma lista, retorna um objeto que gera os números no intervalo sob demanda. Para loop, isso é levemente mais rápido que o range () e mais eficiente em memória. xrange () como um iterador e gera os números sob demanda. (Lazy Evaluation)
fonte
Algumas das outras respostas mencionam que o Python 3 eliminou o 2.x
range
e renomeou o 2.xxrange
pararange
. No entanto, a menos que você esteja usando 3.0 ou 3.1 (que ninguém deveria estar), na verdade é um tipo um pouco diferente.Como dizem os documentos 3.1 :
No entanto, no 3.2+,
range
é uma sequência completa - ele suporta fatias estendidas e todos os métodoscollections.abc.Sequence
com a mesma semântica que alist
. *E, pelo menos em CPython e PyPy (os únicos dois 3.2+ implementações que existem atualmente), ele também tem implementações em tempo constante do
index
ecount
métodos e oin
operador (contanto que você só passá-lo inteiros). Isso significa que a escrita123456 in r
é razoável em 3.2+, enquanto em 2.7 ou 3.1 seria uma ideia horrível.* O fato de
issubclass(xrange, collections.Sequence)
retornarTrue
em 2.6-2.7 e 3.0-3.1 é um bug corrigido no 3.2 e não suportado.fonte
No python 2.x
range (x) retorna uma lista criada na memória com x elementos.
xrange (x) retorna um objeto xrange que é um objeto gerador que gera os números sob demanda. eles são calculados durante o loop for (Lazy Evaluation).
Para loop, isso é um pouco mais rápido que o range () e mais eficiente em memória.
fonte
xrange()
não é um gerador.xrange(n)
.__ iter __ () `é.Ao testar o intervalo contra o xrange em um loop (eu sei que devo usar o timeit , mas isso foi rapidamente hackeado da memória usando um exemplo simples de compreensão de lista), encontrei o seguinte:
que dá:
Ou, usando xrange no loop for:
Meu snippet está testando corretamente? Algum comentário sobre a instância mais lenta do xrange? Ou um exemplo melhor :-)
fonte
xrange
pareceu um pouco mais rápida, embora no Python 3 a comparação agora seja redundante.timeit
serve. Ela cuida de correr muitas vezes, incapacitante GC, usando o melhor relógio em vez detime
, etc.xrange () e range () em python funcionam da mesma forma que para o usuário, mas a diferença ocorre quando estamos falando sobre como a memória é alocada no uso da função.
Quando estamos usando range (), alocamos memória para todas as variáveis que estão gerando, portanto, não é recomendável usar com número maior. de variáveis a serem geradas.
xrange () por outro lado, gera apenas um valor específico de cada vez e só pode ser usado com o loop for para imprimir todos os valores necessários.
fonte
O intervalo gera a lista inteira e a retorna. O xrange não - ele gera os números na lista sob demanda.
fonte
O xrange usa um iterador (gera valores rapidamente), range retorna uma lista.
fonte
O que?
range
retorna uma lista estática em tempo de execução.xrange
retorna umobject
(que age como um gerador, embora certamente não seja um) a partir do qual os valores são gerados como e quando necessário.Quando usar qual?
xrange
se você deseja gerar uma lista para uma faixa gigantesca, digamos 1 bilhão, especialmente quando você tem um "sistema sensível à memória", como um telefone celular.range
se você quiser percorrer a lista várias vezes.PS: do Python 3.x
range
função == do Python 2.xxrange
função.fonte
xrange
não retorna um objeto gerador.Todo mundo explicou muito. Mas eu queria que ele visse por mim mesmo. Eu uso python3. Então, abri o monitor de recursos (no Windows!) E, primeiro, executei o seguinte comando primeiro:
e depois verificou a alteração na memória 'Em uso'. Foi insignificante. Em seguida, executei o seguinte código:
E foi preciso grande parte da memória para uso instantaneamente. E eu estava convencido. Você pode tentar por si mesmo.
Se você estiver usando o Python 2X, substitua 'range ()' por 'xrange ()' no primeiro código e 'list (range ())' por 'range ()'.
fonte
Dos documentos de ajuda.
Python 2.7.12
Python 3.5.2
A diferença é aparente. No Python 2.x,
range
retorna uma lista,xrange
retorna um objeto xrange que é iterável.No Python 3.x,
range
passa a serxrange
do Python 2.xexrange
é removido.fonte
Em um requisito para digitalização / impressão de itens 0-N, o intervalo e o intervalo variam da seguinte maneira.
range () - cria uma nova lista na memória e pega todos os itens de 0 a N (totalmente N + 1) e os imprime. xrange () - cria uma instância do iterador que varre os itens e mantém apenas o item encontrado na memória, utilizando a mesma quantidade de memória o tempo todo.
Caso o elemento requerido esteja apenas no início da lista, ele economiza uma boa quantidade de tempo e memória.
fonte
xrange
não cria uma instância do iterador. Ele cria umxrange
objeto que é iterável, mas não um iterador - quase (mas não exatamente) uma sequência, como uma lista.Range retorna uma lista enquanto xrange retorna um objeto xrange que usa a mesma memória, independentemente do tamanho do intervalo, pois nesse caso, apenas um elemento é gerado e disponível por iteração, enquanto que no caso de usar o intervalo, todos os elementos são gerados de uma só vez e estão disponíveis na memória.
fonte
A diferença diminui para argumentos menores para
range(..)
/xrange(..)
:Nesse caso,
xrange(100)
é apenas 20% mais eficiente.fonte
range: -range irá preencher tudo de uma vez. o que significa que todos os números do intervalo ocuparão a memória.
xrange: -xrange é algo como gerador, ele aparece em imagem quando você deseja o intervalo de números, mas não deseja que eles sejam armazenados, como quando você deseja usar o loop.so, com eficiência de memória.
fonte
Além disso, se do
list(xrange(...))
será equivalente arange(...)
.Então
list
é lento.Também
xrange
realmente não termina completamente a sequênciaÉ por isso que não é uma lista, é um
xrange
objetofonte
range()
em Python2.x
Essa função é essencialmente a
range()
função antiga que estava disponível no Python2.x
e retorna uma instância de umlist
objeto que contém os elementos no intervalo especificado.No entanto, essa implementação é muito ineficiente quando se trata de inicializar uma lista com um intervalo de números. Por exemplo,
for i in range(1000000)
seria um comando muito caro para executar, tanto em termos de memória quanto de uso do tempo, pois requer o armazenamento dessa lista na memória.range()
em Python3.x
exrange()
em Python2.x
O Python
3.x
introduziu uma implementação mais nova derange()
(enquanto a implementação mais recente já estava disponível no Python2.x
através doxrange()
função).O
range()
explora uma estratégia conhecida como avaliação preguiçosa. Em vez de criar uma lista enorme de elementos no intervalo, a implementação mais recente apresenta a classerange
, um objeto leve que representa os elementos necessários no intervalo especificado, sem armazená-los explicitamente na memória (isso pode parecer geradores, mas o conceito de avaliação lenta é diferente).Como exemplo, considere o seguinte:
e
fonte
Veja este post para encontrar a diferença entre range e xrange:
Citar:
fonte
xrange
não é um iterador. A lista retornada porrange
suporta iteração (uma lista é praticamente o exemplo prototípico de uma iterável). O benefício geral dexrange
não é "mínimo". E assim por diante.