Python: дополнительные назначения в функциях - PullRequest
2 голосов
/ 03 января 2012

Учитывая следующее как две версии очень простой функции в Python , вопрос в том, какая из них предпочтительнее другой и почему?

Есть ли дополнительное использование памяти и или использование ЦП для case 1 по сравнению с case 2, в котором использовалось дополнительное назначение?

, дело 1:

def f(x):
    y = x*x
    return y

дело 2:

def f(x):
    return x*x

С моей точки зрения, case 1 более ясен, чем другой, особенно в случае сложных вычислений и обеспечения множества возвращаемых объектов. С другой стороны, case 2 выглядит очень компактно и будет считаться очень привлекательным. Поскольку простое просто эффективно. Что ты думаешь?

Обновление:
Я не знал, что в Python есть дизассемблер! Это было так удивительно, когда я узнал ответ на свой вопрос и как проверить похожие идеи. Особая благодарность.
from dis import dis as dasm
dasm(f)

Ответы [ 3 ]

7 голосов
/ 03 января 2012

Если вы хотите узнать, какой стиль Python предпочтителен, посмотрите код в стандартной библиотеке:

$ grep return Lib/*py

Вы увидите, что стиль case 2 является наиболее распространенным.

Лично я использую форму назначения только тогда, когда имя переменной необходимо для ясности кода:

normalized_query = query.replace(' ', '').lower()
return normalized_query

Этот код вводит очень маленький бит служебной информации для назначения:

>>> def f(x):
        return x + 2

>>> def g(x):
        y = x + 2
        return y

>>> dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (2)
              6 BINARY_ADD          
              7 RETURN_VALUE        
>>> dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (2)
              6 BINARY_ADD          
              7 STORE_FAST               1 (y)

  3          10 LOAD_FAST                1 (y)
             13 RETURN_VALUE 
3 голосов
/ 03 января 2012

Предпочтительным стилем является тот, который наиболее читабелен для этой конкретной функции.Как только у вас есть читаемый, правильный код - вы, вероятно, сделали. Если на тот момент проблема была , создайте профиль, чтобы увидеть узкие места, и работайте в этих точках.

Проще оптимизировать правильный код, чем исправить оптимизированный.

3 голосов
/ 03 января 2012

Для первого:

>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                0 (x)
              6 BINARY_MULTIPLY     
              7 STORE_FAST               1 (y)

  3          10 LOAD_FAST                1 (y)
             13 RETURN_VALUE

Для второго:

>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                0 (x)
              6 BINARY_MULTIPLY     
              7 RETURN_VALUE

Как видите, при присвоении чего-либо есть (небольшие) затраты, даже если вы вообще не используете его, за исключением удержания значения перед возвратом.

...