OVH Cloud OVH Cloud

Réflexion sur str

1 réponse
Avatar
Sébastien V.
Bonjour,

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

(désolé pour l'indentation)

et j'obtiens le résultat suivant :

Pour test1:

4 function calls in 0.028 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.001 0.001 0.001 0.001 :0(setprofile)
1 0.027 0.027 0.027 0.027 <pyshell#8>:1(test1)
1 0.000 0.000 0.027 0.027 <string>:1(?)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.028 0.028 profile:0(test1())

Pour test2

4 function calls in 0.007 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.001 0.001 0.001 0.001 :0(setprofile)
1 0.005 0.005 0.005 0.005 <pyshell#14>:1(test2)
1 0.000 0.000 0.005 0.005 <string>:1(?)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.007 0.007 profile:0(test2())

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)

Merci pour vos infos,

Sébastien.

1 réponse

Avatar
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