2010-09-10 5 views
0

Dans le cas suivant:Compilateur Python bytecode; supprime les variables inutiles?

def foo(): 
    x = a_method_returning_a_long_list() 
    y = a_method_which_filters_a_list(x) 
    return y 

sera le compilateur bytecode Python garder x & y en mémoire, ou est-il assez intelligent pour le réduire à ce qui suit?

def foo(): 
    return a_method_which_filters_a_list(a_method_returning_a_long_list()) 
+0

Est-ce vraiment une réduction? Le résultat de l'un ou l'autre appel doit toujours être conservé quelque part, n'est-ce pas? – detly

Répondre

3

Il maintient x et y dans la mémoire:

import dis 
dis.dis(foo) 
    2   0 LOAD_GLOBAL    0 (a_method_returning_a_long_list) 
       3 CALL_FUNCTION   0 
       6 STORE_FAST    0 (x) 

    3   9 LOAD_GLOBAL    1 (a_method_which_filters_a_list) 
      12 LOAD_FAST    0 (x) 
      15 CALL_FUNCTION   1 
      18 STORE_FAST    1 (y) 

    4   21 LOAD_FAST    1 (y) 
      24 RETURN_VALUE 

L'opération est tout à fait efficace, comme cela se fait à l'aide des LOAD_FAST et STORE_FAST codes.

Comme le fait remarquer Roadrunner-EX dans l'un des commentaires, la quantité de mémoire utilisée par vos deux versions de foo est fondamentalement la même, que x et y ne sont que des références (à savoir, pointeurs) aux résultats.

0

Je ne suis pas certain, mais je suppose qu'il les garderait en mémoire, pour 2 raisons. D'abord, c'est probablement plus d'effort que de valeur pour le faire. Il n'y aurait pas de changement de performance énorme de toute façon. Et deuxièmement, les variables x et y prennent probablement elles-mêmes de la mémoire (sous la forme de pointeurs/références), que le compilateur ne toucherait pas, en raison de la nature explicite de l'assignation.

2
In [1]: import dis 

In [2]: def f(): 
    ...:  x = f1() 
    ...:  y = f2(x) 
    ...:  return y 
    ...: 

In [3]: dis.dis(f) 
    2   0 LOAD_GLOBAL    0 (f1) 
       3 CALL_FUNCTION   0 
       6 STORE_FAST    0 (x) 

    3   9 LOAD_GLOBAL    1 (f2) 
      12 LOAD_FAST    0 (x) 
      15 CALL_FUNCTION   1 
      18 STORE_FAST    1 (y) 

    4   21 LOAD_FAST    1 (y) 
      24 RETURN_VALUE   

Il semble donc que les deux variables sont conservées séparément.