Dans un script j'utilise str(X) afin de convertir X en chaîne (sachant qu'à
priori X est une chaine). Je me suis posé la question de l'optimisation :
str(X) crée-t-elle une nouvelle instance de chaine ? et donc est-ce optimum
que d'utiliser str avec une chaine ?
j'ai fait le test suivant :
>>> if s is str(s):
print "oui"
else:
print " non"
ça affiche oui => C'est la même instance.
J'ai tenté de profilé les 2 fonctions suivantes :
>>> def test1():
s = ''
for i in xrange(0, 10000):
s = "Toto"
t = str(s)
>>> def test2():
s = ''
for i in xrange(0, 10000):
s = "Toto"
t = s
J'avoue ne pas savoir interpréter la différence : proviens-elle uniquement
de l'appel de la méthode str de la chaine ?
(Il faut remarquer que le temps de test1 est 4 fois celle de test2)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
fraca7
[snip]
if s is str(s):
print "oui" else: print " non"
ça affiche oui => C'est la même instance.
Pour ce que j'en sais, CPython optimise l'utilisation mémoire en conservant les chaînes dans une table de hachage (ou un arbre, je ne sais pas) pour les réutiliser. C'est probablement à cause du lookup dans cette table que la 1ère version prend plus longtemps (ça plus l'overhead de l'invocation de str).
On a le même phénomène avec les entiers:
aB bB id(a)==id(b) True
Mais c'est une particularité de CPython et il vaut mieux ne pas compter dessus (Jython ne fait pas ça, par exemple, IronPython probablement pas non plus)...
HTH
[snip]
if s is str(s):
print "oui"
else:
print " non"
ça affiche oui => C'est la même instance.
Pour ce que j'en sais, CPython optimise l'utilisation mémoire en
conservant les chaînes dans une table de hachage (ou un arbre, je ne
sais pas) pour les réutiliser. C'est probablement à cause du lookup dans
cette table que la 1ère version prend plus longtemps (ça plus l'overhead
de l'invocation de str).
On a le même phénomène avec les entiers:
aB
bB
id(a)==id(b)
True
Mais c'est une particularité de CPython et il vaut mieux ne pas compter
dessus (Jython ne fait pas ça, par exemple, IronPython probablement pas
non plus)...
Pour ce que j'en sais, CPython optimise l'utilisation mémoire en conservant les chaînes dans une table de hachage (ou un arbre, je ne sais pas) pour les réutiliser. C'est probablement à cause du lookup dans cette table que la 1ère version prend plus longtemps (ça plus l'overhead de l'invocation de str).
On a le même phénomène avec les entiers:
aB bB id(a)==id(b) True
Mais c'est une particularité de CPython et il vaut mieux ne pas compter dessus (Jython ne fait pas ça, par exemple, IronPython probablement pas non plus)...