Lors du profilage d'un morceau de code python ( python 2.6
jusqu'à 3.2
), j'ai découvert que la
str
méthode pour convertir un objet (dans mon cas un entier) en une chaîne est presque un ordre de grandeur plus lente que l'utilisation du formatage de chaîne.
Voici la référence
>>> from timeit import Timer
>>> Timer('str(100000)').timeit()
0.3145311339386332
>>> Timer('"%s"%100000').timeit()
0.03803517023435887
Est-ce que quelqu'un sait pourquoi c'est le cas? Est-ce que je manque quelque chose?
python
string
performance
python-3.x
python-2.7
Luca Sbardella
la source
la source
'{}'.format(100000)
Réponses:
'%s' % 100000
est évalué par le compilateur et équivaut à une constante au moment de l'exécution.%
avec une expression d'exécution n'est pas (significativement) plus rapide questr
:Notez que
str
c'est encore légèrement plus lent, comme l'a dit @DietrichEpp, car celastr
implique des opérations de recherche et d'appel de fonction, tandis que la%
compilation en un seul bytecode immédiat:Bien sûr, ce qui précède est vrai pour le système sur lequel j'ai testé (CPython 2.7); d'autres implémentations peuvent différer.
la source
str
. Merci de répondre. Aucune raison de changer de code partout :-)str
est un nom qui peut être rebondi vers autre chose que le type de chaîne, mais le formatage de chaîne - c'est-à-dire lastr.__mod__
méthode - ne peut pas être remplacé, ce qui permet au compilateur de faire l'optimisation. Le compilateur ne fait pas grand-chose en termes d'optimisation, mais il fait plus que vous ne le pensez :)Une raison qui me vient à l'esprit est le fait que cela
str(100000)
implique une recherche globale, mais ce"%s"%100000
n'est pas le cas. Lestr
global doit être regardé dans la portée globale. Cela ne tient pas compte de toute la différence:Comme indiqué par thg435 ,
la source