Компилятор байт-кода Python; удаляет ненужные переменные? - PullRequest
0 голосов
/ 10 сентября 2010

Учитывая следующее:

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

будет ли компилятор байт-кода Python хранить x & y в памяти, или он достаточно умен, чтобы уменьшить его до следующего?

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

Ответы [ 3 ]

3 голосов
/ 10 сентября 2010

Хранит x и y в памяти:

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

Вся операция достаточно эффективна, поскольку выполняется с использованием кодов LOAD_FAST и STORE_FAST.

Как отмечает Roadrunner-EX в одном из комментариев, объем памяти, используемой вашими двумя версиями foo, в основном одинаков, поскольку x и y являются просто ссылками (то есть указателями) на результаты.

2 голосов
/ 10 сентября 2010
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        

Похоже, что обе переменные хранятся отдельно.

0 голосов
/ 10 сентября 2010

Я не уверен, но я думаю, это сохранит их в памяти по двум причинам. Во-первых, это, вероятно, больше усилий, чем стоит того. В любом случае не будет большого изменения производительности. Во-вторых, переменные x и y, вероятно, сами занимают память (в виде указателей / ссылок), которую компилятор не трогал из-за явного характера присваивания.

...