87 votes

performance str en python

Lors du profilage d'un morceau de code python ( python 2.6 jusqu'à 3.2 ), j'ai découvert que la méthode str pour convertir un objet (dans mon cas un entier) en une chaîne est presque d'un ordre de grandeur plus lente que le formatage de chaîne.

Voici le repère

 >>> 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?

105voto

georg Points 52691

'%s' % 100000 est évalué par le compilateur et est équivalente à une constante au moment de l'exécution.

>>> import dis
>>> dis.dis(lambda: str(100000))
  8           0 LOAD_GLOBAL              0 (str)
              3 LOAD_CONST               1 (100000)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda: '%s' % 100000)
  9           0 LOAD_CONST               3 ('100000')
              3 RETURN_VALUE        

% avec une expression n'est pas (beaucoup) plus rapide que l' str:

>>> Timer('str(x)', 'x=100').timeit()
0.25641703605651855
>>> Timer('"%s" % x', 'x=100').timeit()
0.2169809341430664

Notez qu' str est toujours un peu plus lent, comme @DietrichEpp dit, c'est parce qu' str implique de recherche et d'appel de fonction, les opérations, tandis que l' % compilé en un seul immédiate du bytecode:

>>> dis.dis(lambda x: str(x))
  9           0 LOAD_GLOBAL              0 (str)
              3 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda x: '%s' % x)
 10           0 LOAD_CONST               1 ('%s')
              3 LOAD_FAST                0 (x)
              6 BINARY_MODULO       
              7 RETURN_VALUE        

Bien sûr, ce qui précède est vrai pour le système que j'ai testé sur (Disponible 2.7); d'autres implémentations peuvent différer.

14voto

Dietrich Epp Points 72865

Une des raisons qui me vient à l’esprit est le fait que implique une recherche globale, mais ne fonctionne pas. Le `` mondial doit être recherché dans la portée globale. Cela ne tient pas compte de la différence de toute :

Comme l’a souligné thg435,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X