¿Por qué "1000000000000000 en rango (1000000000000001)" es tan rápido en Python 3?

Tengo entendido que elrange() función, que en realidad esun tipo de objeto en Python 3, genera su contenido sobre la marcha, similar a un generador.

Siendo este el caso, hubiera esperado que la siguiente línea tomara una cantidad excesiva de tiempo, porque para determinar si 1 billón está en el rango, se tendrían que generar un billón de valores:

1000000000000000 in range(1000000000000001)

Además: parece que no importa cuántos ceros agregue, el cálculo lleva más o menos la misma cantidad de tiempo (básicamente instantáneo).

También he intentado cosas como esta, pero el cálculo aún es casi instantáneo:

1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens

¡Si trato de implementar mi propia función de rango, el resultado no es tan bueno!

def my_crappy_range(N):
    i = 0
    while i < N:
        yield i
        i += 1
    return

Cuál es elrange() ¿Qué objeto hace debajo del capó que lo hace tan rápido?

La respuesta de Martijn Pieters fue elegido por su integridad, pero también verprimera respuesta de abarnert para una buena discusión de lo que significa pararange ser un hecho y derechosecuencia en Python 3, y alguna información / advertencia sobre posibles inconsistencias para__contains__ optimización de funciones en implementaciones de Python.la otra respuesta de abarnert entra en más detalles y proporciona enlaces para aquellos interesados en la historia detrás de la optimización en Python 3 (y la falta de optimización dexrange en Python 2). Respuestaspor empuje ypor wim proporcione el código fuente de C relevante y explicaciones para aquellos que estén interesados.

Respuestas a la pregunta(9)

Su respuesta a la pregunta