Table des matières
Mécanisme d'évaluation non-paresseux de Python
Scénario 1: Répertoriez explicitement les variables
Scénario 2: Liste les littéraux sont directement utilisés pour la création d'Itérator
La différence de base entre l'utilisation de la mémoire et le cycle de vie
Optimisation et précautions
1. Optimiser la mémoire à l'aide d'expressions de générateur
2. Comprendre les responsabilités de la fonction iter ()
3. Mécanisme de collecte des ordures de Python
Résumer
Maison développement back-end Tutoriel Python Compréhension de la liste Python et comportement de la mémoire itérateur Analyse approfondie

Compréhension de la liste Python et comportement de la mémoire itérateur Analyse approfondie

Sep 17, 2025 am 06:18 AM

Compréhension de la liste Python et comportement de la mémoire itérateur Analyse approfondie

Cet article explore profondément le comportement des littéraux de la liste, des compréhensions de la liste et des itérateurs dans Python dans la gestion de la mémoire. Le point central est que les caractéristiques d'évaluation non paresseuses de Python conduisent à une compréhension de la liste qui sera créée et consommée de mémoire d'abord, qu'elle soit affectée ou non à une variable. La principale différence est que la liste que les littéraux de variables non liés sont les déchets collectés plus rapidement après la création de l'itérateur, tandis que les listes sont liées aux variables restent occupantes tout au long du cycle de vie variable.

Mécanisme d'évaluation non-paresseux de Python

Dans Python, l'évaluation d'une expression est généralement "non-paresseuse", ce qui signifie que lorsqu'une expression est exécutée, sa valeur est calculée immédiatement, plutôt que d'attendre qu'il soit nécessaire. Pour la compréhension de la liste [Expression pour l'élément dans ITable], cela signifie que, que le résultat de cette compréhension de cette liste soit attribué à une variable, il créera d'abord un objet de liste complet et tous ses éléments en mémoire.

Considérez deux scénarios qui montrent un degré élevé de similitude dans l'empreinte de mémoire initiale:

Scénario 1: Répertoriez explicitement les variables

Lorsque nous attribuons le résultat d'une compréhension de la liste à une variable, l'objet de liste et tous les éléments qu'il contient resteront en mémoire jusqu'à ce que la variable soit réaffectée, supprimée ou dépassé son étendue.

 # Code 1: Liste se lie explicitement à la variable importation sys

# Cette ligne de code créera immédiatement une liste complète de 5000 entiers et le liera à my_list
my_list = [l pour l dans la plage (5000)]
print (f "list 'my_list' object 'Memory Footprint (excluant l'élément lui-même): {sys.getSizeof (my_list)} octets")
# Remarque: Sys.getSizeof () Renvoie l'empreinte de la mémoire de l'objet List lui-même.
# Exclut l'utilisation totale de la mémoire de 5000 objets entiers à l'intérieur. Mais surtout, ces 5000 objets entiers ont en effet été créés.

# Créer un iterateur à partir d'une liste existante my_iter1 = iter (my_list)
print (f "iterator 'my_iter1' objet 'Memory Footprint: {sys.getSizeof (my_iter1)} octets (généralement plus petit)")

# Dans ce scénario, My_List et tous les objets entiers référencés continueront d'occuper la mémoire.
# Jusqu'à ce que My_List soit collecté des ordures ou que le programme se termine.

Dans cet exemple, [l pour l dans la gamme (5000)] crée une liste de 5000 entiers. Même si nous en créons ensuite un itérateur à partir de celui-ci, la My_List d'origine et tous ses éléments existent toujours en mémoire et sont accessibles via la variable my_list.

Scénario 2: Liste les littéraux sont directement utilisés pour la création d'Itérator

Lorsque le résultat de la compréhension de la liste n'est pas explicitement attribué à une variable, mais qu'il est directement transmis à une fonction (comme iter ()), Python créera également cette liste complètement d'abord.

 # Code 2: Liste Les littéraux sont utilisés directement pour créer des systèmes d'importation par itérateur

# Bien qu'il n'y ait pas de réception variable explicite, [i pour i dans la plage (5000)] créera immédiatement une liste complète de # avec 5000 entiers.
# Ensuite, la fonction iter () recevra cette liste temporairement créée en tant que paramètre.
my_iter2 = iter ([i pour i dans la plage (5000)])
Imprimer (f "Iterator 'my_iter2' Object's Memory Footprint: {sys.getSizeof (my_iter2)} octets (généralement plus petit)")

# Point clé: objet de liste anonyme utilisé pour créer un iterator, après le retour de la fonction iter (),
# S'il n'y a pas d'autres références, il deviendra immédiatement un candidat pour la collecte des ordures.

Dans ce scénario, [i pour i dans la gamme (5000)] créera également une liste de 5000 entiers. La fonction iter () reçoit cette liste temporaire et renvoie un itérateur pour lui. Une fois la fonction iter () exécutée et nulle part ailleurs référence à cet objet de liste créé temporairement, le mécanisme de collecte des ordures de Python peut recycler la mémoire de la liste et de ses éléments.

La différence de base entre l'utilisation de la mémoire et le cycle de vie

Grâce à l'analyse ci-dessus, nous pouvons tirer les conclusions suivantes:

  1. Empreinte de mémoire initiale: dans les deux scénarios, les expressions [L pour L dans la plage (5000)] ou [i pour i dans la plage (5000)] créeront et occuperont approximativement le même espace mémoire lorsqu'ils sont exécutés, car Python créera cette liste en totalité. Par conséquent, du point de vue de "si une grande quantité de données a été créée", le code 1 et le code 2 sont similaires dans l'étape de création de la liste.
  2. Cycle de vie de la mémoire: la différence de base réside dans le cycle de vie des objets de liste en mémoire.
    • Dans le scénario un , la liste est liée à la variable my_list, et sa mémoire continuera à être consommée jusqu'à ce que le cycle de vie de la variable my_list se termine.
    • Dans le scénario 2 , la liste est un objet temporaire et anonyme. Il est créé et utilisé comme argument de la fonction iter (), et une fois que la fonction iter () renvoie et aucune autre référence ne pointe vers cet objet de liste, il devient immédiatement un candidat pour la collecte des ordures. Cela signifie que son empreinte mémoire est de courte durée.

En bref, func (expression) et variable = expression; Les modes FUNC (variable), sous le mécanisme d'évaluation non-paresseux de Python, l'expression doit être entièrement calculée et allouée à la mémoire. La seule différence est qu'après que func () revient, si la mémoire n'est pas stockée en interne par func (), sa mémoire sera recyclable immédiatement; tandis que ce dernier prolongera le cycle de vie de la mémoire en raison de l'existence d'une variable.

Optimisation et précautions

Pour les applications qui traitent de grands ensembles de données ou poursuivent l'efficacité de la mémoire, la création d'une liste complète n'est souvent pas le meilleur choix.

1. Optimiser la mémoire à l'aide d'expressions de générateur

Si votre objectif est de créer un itérateur et que vous n'avez pas besoin de garder la liste entière en mémoire en même temps, vous devez utiliser les expressions de générateur au lieu de compréhensions de la liste. L'expression du générateur utilise des parenthèses () au lieu de crochets [], qui ne construit pas tous les éléments à la fois, mais les génère à la demande:

 # Utiliser l'expression du générateur Import Sys

# my_generator_iter est un objet générateur qui ne crée pas les 5000 entiers immédiatement my_generator_iter = (i pour i dans la plage (5000))
print (f "Utilisation de la mémoire de l'objet générateur 'my_generator_iter': {sys.getSizeof (my_generator_iter)} octets (très petit)")

# Uniquement lors de l'itération, les éléments seront générés un par un et prendront la mémoire pour l'élément dans my_generator_iter:
    # Élément de processus
    passer

L'avantage des expressions du générateur est qu'il calcule et génère l'élément suivant en cas de besoin, réduisant considérablement l'empreinte de mémoire de pointe.

2. Comprendre les responsabilités de la fonction iter ()

La fonction de la fonction iter () est d'obtenir un itérateur d'un objet. Il n'est pas responsable de la création des données elle-même, mais plutôt d'obtenir un itérateur à partir d'un objet itérable existant. Par conséquent, si vous passez ITER () une grande liste, la création et l'utilisation de la mémoire de cette grande liste se sont déjà produites, et Iter () fournit simplement un mécanisme de traversée sur cette base.

3. Mécanisme de collecte des ordures de Python

Python utilise le comptage des références comme principal mécanisme de collecte des ordures. Lorsque le nombre de références d'un objet devient 0, il devient un candidat pour la collecte des ordures. Pour les références circulaires, Python utilise également l'algorithme Mark-and-Sweep pour le traitement. Comprendre ces mécanismes aide à mieux gérer la mémoire.

Résumer

Lorsque Python traite les compréhensions de la liste, que le résultat soit attribué à une variable, il effectuera d'abord une évaluation complète et créera un objet de liste complet en mémoire. Par conséquent, iter ([i pour i dans la plage (5000)]) et my_list = [l pour l dans la plage (5000)]; Iter (my_list) est similaire dans l'allocation de mémoire initiale, car les deux créent une liste de 5000 entiers. La principale différence est le cycle de vie de cet objet de liste: une liste littérale non liée à une variable deviendra un candidat pour la collecte des ordures plus rapidement après avoir terminé ses responsabilités (si elle est utilisée par Iter ()), tandis qu'une liste d'une variable continuera de consommer de la mémoire jusqu'à la fin du cycle de vie de la variable.

Pour gérer efficacement la mémoire, en particulier lors du traitement de grandes quantités de données, il est recommandé d'utiliser des expressions de générateur pour un élément dans itérable pour créer des itérateurs pour éviter de charger toutes les données en mémoire à la fois.

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 de ce site Web
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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment installer des packages à partir d'un fichier exigence.txt dans Python Comment installer des packages à partir d'un fichier exigence.txt dans Python Sep 18, 2025 am 04:24 AM

Exécutez pipinstall-rrequirements.txt pour installer le package de dépendance. Il est recommandé de créer et d'activer l'environnement virtuel d'abord pour éviter les conflits, s'assurer que le chemin du fichier est correct et que le PIP a été mis à jour et utiliser des options telles que --No-Deps ou --User pour ajuster le comportement d'installation si nécessaire.

Stratégie de fusion efficace de l'adaptateur et du modèle de base PEFT LORA Stratégie de fusion efficace de l'adaptateur et du modèle de base PEFT LORA Sep 19, 2025 pm 05:12 PM

Ce tutoriel détaille comment fusionner efficacement l'adaptateur PEFT LORA avec le modèle de base pour générer un modèle complètement indépendant. L'article souligne qu'il est faux d'utiliser directement Transformers.Automodel pour charger l'adaptateur et fusionner manuellement les poids, et fournit le processus correct pour utiliser la méthode Merge_and_unload dans la bibliothèque PEFT. De plus, le tutoriel souligne également l'importance de traiter les segments de mots et discute des problèmes et des solutions de compatibilité des versions de PEFT.

Comment tester le code Python avec Pytest Comment tester le code Python avec Pytest Sep 20, 2025 am 12:35 AM

Python est un outil de test simple et puissant dans Python. Après l'installation, les fichiers de test sont automatiquement découverts en fonction des règles de dénomination. Écrivez une fonction commençant par test_ pour les tests d'assurance, utilisez @ pytest.fixture pour créer des données de test réutilisables, vérifiez les exceptions via PyTest.Rais, prend en charge l'exécution de tests spécifiés et plusieurs options de ligne de commande et améliore l'efficacité des tests.

Problème de précision du nombre de points flottants dans Python et son schéma de calcul de haute précision Problème de précision du nombre de points flottants dans Python et son schéma de calcul de haute précision Sep 19, 2025 pm 05:57 PM

Cet article vise à explorer le problème commun de la précision de calcul insuffisante des nombres de points flottants dans Python et Numpy, et explique que sa cause profonde réside dans la limitation de représentation des nombres de points flottants 64 bits standard. Pour les scénarios informatiques qui nécessitent une précision plus élevée, l'article introduira et comparera les méthodes d'utilisation, les fonctionnalités et les scénarios applicables de bibliothèques mathématiques de haute précision telles que MPMATH, SYMPY et GMPY pour aider les lecteurs à choisir les bons outils pour résoudre les besoins de précision complexe.

Comment gérer les arguments de ligne de commande dans Python Comment gérer les arguments de ligne de commande dans Python Sep 21, 2025 am 03:49 AM

TheargParsemoduleisthereComMendwaytoHandleCommand-lineargumentsInpython, fournissantRobustParsing, Typevalidation, HelpMessages, AnderrorHling; usys.argvforsimplécasesrequiringminimalsepup.

Comment travailler avec les fichiers PDF dans Python Comment travailler avec les fichiers PDF dans Python Sep 20, 2025 am 04:44 AM

PYPDF2, PDFPLUMBER et FPDF sont les bibliothèques de base pour Python pour traiter PDF. Utilisez le PYPDF2 pour effectuer l'extraction de texte, la fusion, la division et le chiffrement, tels que la lecture de la page via Pdfreader et l'appel extract_text () pour obtenir du contenu; PDFPLUMBER convient plus pour conserver l'extraction de texte de mise en page et la reconnaissance de la table, et prend en charge extract_tables () pour capturer avec précision les données de table; FPDF (FPDF2 recommandé) est utilisé pour générer du PDF, et les documents sont construits et sorties via add_page (), set_font () et cellule (). Lors de la fusion des PDF

Python Obtenez l'exemple de l'heure actuelle Python Obtenez l'exemple de l'heure actuelle Sep 15, 2025 am 02:32 AM

L'obtention de l'heure actuelle peut être implémentée dans Python via le module DateTime. 1. Utilisez dateTime.now () pour obtenir l'heure actuelle locale, 2. Utilisez le strftime ("% y-% m-% d% h:% m:% s") pour formater l'année de sortie, le mois, le jour, l'heure, la minute et la seconde, 3. UTCNow () et les opérations quotidiennes peuvent répondre aux besoins en combinant DateTime.now () avec des chaînes formatées.

Intégration efficace des données multi-fichiers à l'aide du didacticiel Pandas: IP, Mac et Port Association Intégration efficace des données multi-fichiers à l'aide du didacticiel Pandas: IP, Mac et Port Association Sep 21, 2025 pm 03:00 PM

Ce didacticiel montre en détail comment extraire, corréler et intégrer efficacement des données spécifiques à partir de plusieurs fichiers texte à l'aide de la bibliothèque Pandas de Python. En chargeant les données du fichier dans une dataframe et en utilisant l'opération de fusion pour effectuer des connexions internes en fonction de l'adresse IP et de l'adresse MAC, de l'implémentation finale de correspondance précise et de diffusion des informations d'association de l'IP, de l'adresse MAC et des ports correspondants à partir de fichiers provenant de différentes sources.

See all articles