comment puis-je effacer un stringio objet?
J'ai un stringio objet créé et il a un texte. J'aimerais clairement ses valeurs et les réutiliser au lieu de le lui rappeler. Est-il de toute façon de faire cela?
Vous devez vous connecter pour publier un commentaire.
TL;DR
N'est pas la peine de compensation, il suffit de créer un nouveau—c'est plus rapide.
La méthode
Python 2
Voici comment je pourrais trouver de telles choses:
Donc, vous voulez
.truncate(0)
. Mais c'est probablement moins cher (et plus facile) à l'initialisation d'un nouveau StringIO. Voir ci-dessous pour les indices de référence.Python 3
(Grâce à tstone2077 pour pointant la différence.)
Il est important de noter à ce que maintenant la position courante dans le fichier est inchangé, alors que la troncation de la taille zéro serait réinitialiser la position dans le Python 2 variante.
Ainsi, pour Python 2, vous avez seulement besoin
Si vous le faites en Python 3, vous n'obtiendrez pas le résultat que vous attendiez:
Donc en Python 3, vous aussi besoin de réinitialiser la position:
Si à l'aide de la
truncate
méthode en Python 2 code, il est plus prudent d'appelerseek(0)
en même temps (avant ou après, il n'a pas d'importance), de sorte que le code ne sera pas casser lorsque vous inévitablement port à Python 3. Et il y a une autre raison pourquoi vous devriez vous suffit de créer un nouveauStringIO
objet!Fois
Python 2
Quand il est vide, avec StringIO:
Avec 3 KO de données, avec StringIO:
Et la même chose avec cStringIO:
Donc, en ignorant les éventuels problèmes de mémoire (
del oldstringio
), il est plus rapide de tronquer uneStringIO.StringIO
(3% plus rapide pour le vide, 8% plus rapide pour les 3 KO de données), mais il est plus rapide ("fasterer" trop) pour créer un nouveaucStringIO.StringIO
(8% plus rapide pour le vide, 10% plus rapide pour les 3 KO de données). Donc, je vous recommande simplement à l'aide de la plus simple—donc, en supposant que vous travaillez avec Disponible, utilisezcStringIO
et en créer de nouveaux.Python 3
Le même code, juste avec
seek(0)
mettre en.Quand il est vide:
Avec 3 KO de données:
Donc pour Python 3 en créer un nouveau au lieu de réutiliser un vide est 11% plus rapide et la création d'un nouveau lieu de la réutilisation d'un 3K est 5% plus rapide. Encore une fois, créer un nouveau
StringIO
plutôt que de tronquer et de la recherche.StringIO.StringIO
, mais pas pourcStringIO.StringIO
(voir la conclusion)truncate
. Donc je suppose que ça dépend des cas.Il y a quelque chose d'important à noter (au moins avec Python 3.2):
seek(0) EST nécessaires avant de tronquer(0). Voici un code sans le chercher(0):
Sorties:
avec seek(0) avant de les tronquer, nous obtenons le résultat attendu:
Comment j'ai réussi à optimiser mon traitement (lire en morceaux, chaque morceau, écrire des traités flux de sortie vers un fichier) de nombreux fichiers dans une séquence, c'est que je réutiliser le même
cStringIO.StringIO
exemple, mais toujoursreset()
après utilisation, puis écrire, et puistruncate()
. En faisant cela, je suis le seul à en tronquant la partie à la fin que je n'ai pas besoin pour le fichier en cours. Cela semble m'ont donné un ~3% d'augmentation des performances. Quelqu'un qui est plus expert sur ce qui pourrait confirmer si cela optimise l'allocation de mémoire.StringIO
etcStringIO
)? Je serais intéressé de les voir.