Le problème :
Étant donné une liste d'entiers, générez toutes les sous-listes du former L[k:] pour k dans [0, len(L)-1] efficacement sans créer copies.
La réponse :
Découper une liste en Python ne génère pas de copies des objets sous-jacents, seulement des références à ceux-ci.
Pour démontrer cela, considérons trois objets entiers avec la même valeur :
a = [1000 + 1, 1000 + 1, 1000 + 1]
Ils ont un objet distinct ID, indiquant qu'il s'agit d'objets distincts :
map(id, a) # returns [140502922988976, 140502922988952, 140502922988928]
Le découpage de ces objets entraîne de nouveaux objets de liste avec les mêmes références, montrant qu'aucun nouvel objet n'a été créé :
b = a[1:3] map(id, b) # returns [140502922988952, 140502922988928]
Ceci le comportement s'applique à la fois aux valeurs immuables (par exemple, les entiers) et mutables (par exemple, les listes).
Bien que le découpage ne génère pas de nouveaux objets, il entraîne une certaine surcharge de mémoire en raison de la copie des références et de la maintenance des métadonnées de la liste. Par exemple, une liste avec N éléments a une surcharge de mémoire de 72 octets.
Si l'optimisation de la mémoire est cruciale, envisagez d'utiliser des tableaux numpy au lieu de listes, comme découpage de tableaux numpy partage la mémoire entre la tranche et le tableau d'origine. Cependant, cette approche nécessite une manipulation prudente pour éviter des modifications involontaires.
Le découpage de listes en Python est une opération efficace qui ne génère pas de copies des objets sous-jacents. Ce comportement doit être pris en compte lors de l'examen des optimisations de performances.
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!