Python >> Tutoriel Python >  >> Python

Qu'est-ce que la mise en mémoire tampon de sortie Python et comment la désactiver ?

Résumé : Tampon de sortie Python est le processus de stockage de la sortie de votre code dans la mémoire tampon. Une fois le tampon plein, la sortie s'affiche sur l'écran de sortie standard. La mise en mémoire tampon est activée par défaut et vous pouvez utiliser l'une des méthodes suivantes pour la désactiver :

  • Exécuter le code Python avec le -u commutateur de ligne de commande, par exemple python -u code.py
  • Utilisez le flush mot-clé
  • Utilisez sys.stdout.flush()
  • Envelopper sys.stdout en TextIOWrapper et définissez la taille de la mémoire tampon sur 0
  • Définir PYTHONUNBUFFERED à une chaîne non vide

Problème : Étant donné un programme Python ; comment désactiver la mise en mémoire tampon de sortie ?

Présentation de la mise en mémoire tampon de sortie Python

Avant d'apprendre la mise en mémoire tampon dans le contexte de Python, nous devrions réfléchir à ce que signifie la mémoire tampon dans la vraie vie ? Permettez-moi de répondre à cette question par une autre question. Lorsque vous êtes dans une situation stressante, à qui ou à quoi pensez-vous comme option pour réduire votre stress ? Sur le plan personnel, j'admire mes amis et ma famille. Ils sont donc mon "tampon » contre le stress.

Selon la définition du dictionnaire, un tampon est une personne ou une chose qui réduit un choc ou qui forme une barrière entre des personnes ou des choses incompatibles ou antagonistes. C'est exactement ce que fait un tampon lorsqu'il s'agit d'un langage de programmation comme Python (bien qu'il ne s'agisse pas d'une personne dans ce cas).

En termes d'informatique, vous pouvez considérer le tampon comme une couche intermédiaire qui assure un moyen plus efficace de transférer les données d'un emplacement à un autre dans le système . Par exemple, si vous téléchargez un fichier de 100 Mo et que 1 Mo est écrit à la fois sur le disque dur, cela signifie qu'il faudrait un total de 100 écritures sur disque. Cependant, un tampon peut garantir que 10 Mo sont écrits à la fois sur le disque, et de cette façon, seules 10 écritures sur disque seront nécessaires.

Avantages et inconvénients :

À partir du scénario ci-dessus, nous avons appris comment le tampon peut agir comme une ressource intermédiaire et réduire le nombre d'écritures sur disque, améliorant ainsi l'efficacité d'écriture et la gestion de la mémoire. Cependant, lorsqu'il s'agit d'un langage de programmation, la mise en mémoire tampon a également un inconvénient. Nous ne pouvons pas voir la sortie en temps réel. Cela ne fait pas beaucoup de différence dans le cas de programmes simples ou courts, mais dans les programmes complexes et longs qui nécessitent beaucoup de calculs, cela peut devenir un inconvénient majeur car nous pourrions avoir besoin d'une sortie plus granulaire plutôt que la sortie entière affichée à une fois à des fins de débogage et de test.

Exemple : Considérons le programme suivant pour lequel nous comparerons les sorties tamponnées et non tamponnées :

for buffer in range(20):
    print(buffer, end=" ")

Nous savons que la sortie est une plage de nombres de 0 à 19, c'est-à-dire

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

Mais nous sommes plus intéressés à comprendre la nature de la sortie. Si la mise en mémoire tampon est activée, vous obtiendrez la sortie immédiatement à l'écran après avoir attendu 19 secondes. Cependant, lorsque la mise en mémoire tampon est désactivée, les chiffres seront affichés un par un toutes les 2 secondes.

Vous pouvez essayer ceci dans notre shell interactif :

Exercice :Quel comportement observez-vous ?

Comment désactiver la mise en mémoire tampon de sortie en Python ?

Par défaut, la mise en mémoire tampon de sortie est activée dans Python. Voyons les différentes façons de désactiver la mise en mémoire tampon de sortie en python.

Méthode 1 :Exécuter Python avec l'argument de ligne de commande -u

Si vous souhaitez ignorer la mise en mémoire tampon pour l'ensemble du programme, la solution la plus simple consiste à exécuter votre programme à l'aide de l'interface de ligne de commande et d'utiliser le -u passer en contournement de la mise en mémoire tampon. La syntaxe pour désactiver la mise en mémoire tampon via la ligne de commande est :

python -u filename.py

Sortie

Méthode 2 :Utilisation du mot-clé Flush

Si vous souhaitez ignorer la mise en mémoire tampon pour des lignes spécifiques de votre code, passez le flush mot-clé comme argument de l'instruction print est une bonne option. Par défaut, l'argument flush est défini sur False . Pour s'assurer que la mise en mémoire tampon de sortie est désactivée, l'argument flush doit être défini sur True .

Examinons l'exemple suivant pour comprendre la syntaxe et l'utilisation du flush mot-clé :

import time
for buffer in range(20):
    print(buffer, end=" ", flush=True)
    time.sleep(2)

Sortie

Méthode 3 :Utilisation de sys.stdout.flush()

Utilisation du sys.stdout.flush() force le programme à vider le tampon. Par conséquent, tout ce qui se trouve dans le tampon sera affiché sur la sortie standard sans délai.

Voyons comment sys.stdout.flush() fonctionne dans le programme suivant :

import time
import sys


for buffer in range(20):
    print(buffer, end=" ")
    sys.stdout.flush()
    time.sleep(2)

Sortie

Méthode 4 :Envelopper sys.stdout à l'aide de TextIOWrapper et définir la taille de la mémoire tampon = 0

Une autre approche pour désactiver la mise en mémoire tampon de sortie en python consiste à ouvrir le stdout en mode écriture avec une taille de tampon définie sur 0 (sans tampon), puis en l'enveloppant à l'aide de TextIOWrapper pour vous assurer que vous obtenez un flux TextIO et non un objet de fichier binaire. De plus, vous devez vous assurer d'activer le write_through pour éliminer tous les tampons.

Examinons le code suivant pour mieux comprendre l'explication ci-dessus :

# open the stdout file descriptor in write mode and set 0 as the buffer size: unbuffered
import io
import os
import sys
import time

try:
    # open stdout in binary mode, then wrap it in a TextIOWrapper and enable write_through
    sys.stdout = io.TextIOWrapper(open(sys.stdout.fileno(), 'wb', 0), write_through=True)
    # for flushing on newlines only use :
    # sys.stdout.reconfigure(line_buffering=True)
except TypeError:
    # In case you are on Python 2
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

print("Enter a Line: ")
line = sys.stdin.readline()
for i in line:
    print(i, end=" ")
    time.sleep(2)

Sortie

Méthode 5 :Définition de la variable d'environnement Python PYTHONUNBUFFERED

Lorsque le PYTHONUNBUFFERED variable est définie sur une chaîne non vide, elle équivaut au -u option de ligne de commande.

Conclusion

J'espère que cet article vous a aidé à avoir un aperçu de la mise en mémoire tampon de sortie Python et des méthodes pour la désactiver. Veuillez rester à l'écoute pour des articles plus intéressants.