Maison >développement back-end >Tutoriel Python >Comment l'objet `range()` de Python réalise-t-il des vérifications d'adhésion quasi instantanées pour des plages extrêmement grandes ?

Comment l'objet `range()` de Python réalise-t-il des vérifications d'adhésion quasi instantanées pour des plages extrêmement grandes ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-07 22:57:14479parcourir

How Does Python's `range()` Object Achieve Near-Instantaneous Membership Checks for Extremely Large Ranges?

La vitesse surprenante de l'objet Range de Python

Dans Python 3, la fonction range() génère un objet qui représente une plage de nombres. Cet objet diffère du générateur traditionnel en ce sens qu'il ne crée pas toute la plage en mémoire. Au lieu de cela, il produit des nombres à la demande, ce qui le rend beaucoup plus rapide pour les grandes plages.

Le problème :

Intuitivement, déterminer si un nombre se situe dans une plage nécessite de parcourir toutes les valeurs dans cette plage. Cependant, l'objet Python 3 range() défie cette attente en effectuant de telles vérifications presque instantanément, même pour de vastes plages.

La solution :

L'objet range() ne stocke pas physiquement toute la gamme. Au lieu de cela, il contient les valeurs de début, de fin et d'étape. Lors du test d’appartenance, il calcule le résultat en fonction uniquement de ces valeurs. Ce calcul est exécuté en code C, ce qui contribue à sa grande efficacité.

Une comparaison :

Le code Python suivant compare les performances de l'objet range() avec une implémentation personnalisée qui génère des nombres à la volée :

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

1_000_000_000_000_000 in range(1_000_000_000_000_001)
1_000_000_000_000_000_000_000 in range(1_000_000_000_000_000_000_001)

for number in my_crappy_range(100):
    print(number)

L'objet range() effectue les vérifications presque instantanément, alors que l'implémentation personnalisée prend considérablement plus longtemps.

Optimisations supplémentaires :

L'objet range() implémente également un hook contient qui optimise les tests de confinement. Cette optimisation permet à l'objet de déterminer si un nombre est dans sa plage en temps quasi constant, quelle que soit la taille de la plage.

Conclusion :

La plage Python 3( ) la vitesse exceptionnelle de l'objet résulte de sa structure de données efficace et de ses opérations optimisées. Il stocke un minimum d'informations et calcule les valeurs demandées à la volée, permettant des tests de confinement presque instantanés, même pour des plages énormes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn