Entendo que a range()
função, que na verdade é um tipo de objeto no Python 3 , gera seu conteúdo rapidamente, semelhante a um gerador.
Sendo esse o caso, eu esperaria que a linha a seguir levasse um tempo excessivo, porque, para determinar se 1 quadrilhão está no intervalo, seria necessário gerar um quadrilhão de valores:
1000000000000000 in range(1000000000000001)
Além disso: parece que não importa quantos zeros adiciono, o cálculo leva mais ou menos a mesma quantidade de tempo (basicamente instantâneo).
Eu também tentei coisas assim, mas o cálculo ainda é quase instantâneo:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Se eu tentar implementar minha própria função de faixa, o resultado não é tão bom!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
O que o range()
objeto está fazendo sob o capô que o torna tão rápido?
A resposta de Martijn Pieters foi escolhida por sua integralidade, mas também é a primeira resposta de abarnert para uma boa discussão sobre o que significa range
ser uma sequência completa no Python 3 e algumas informações / avisos sobre inconsistência potencial para __contains__
otimização de funções nas implementações do Python . A outra resposta de abarnert entra em mais detalhes e fornece links para os interessados na história por trás da otimização no Python 3 (e falta de otimização xrange
no Python 2). Respostas por cutucar e por wim fornecem o código fonte C relevante e explicações para aqueles que estão interessados.
range
é um gerador?
xrange
igual ao Python3range
?
xrange()
objetos @Superbest não têm __contains__
método, portanto a verificação do item precisa percorrer todos os itens. Além disso, existem algumas outras mudanças em range()
, como ele suporta corte (que novamente retorna um range
objeto) e agora também tem count
e index
métodos para torná-lo compatível com o collections.Sequence
ABC.
bool
oulong
, com outros tipos de objetos ele ficará louco. Tente com:100000000000000.0 in range(1000000000000001)