Использование блока операторов против использования функций в Python - PullRequest
0 голосов
/ 08 февраля 2012

Какой из них лучше с точки зрения производительности:

def check():
   if (statement1 and
       statement2 and
       statement3):
     return True
   else: 
     return False

def doIt():
   if check():
     perform()

против

def doIt():
   if (statement1 and
       statement2 and
       statement3):
      perform()

Ответы [ 3 ]

4 голосов
/ 08 февраля 2012

Не беспокойся. Первый более читабелен, используйте его, и если ваше приложение страдает от проблем с производительностью, профилируйте код. Если вы определили это как проблему, вы можете встроить вызов функции.

Вообще говоря, вызовы функций в Python стоят дорого, поэтому, если вызов check будет выполняться ОЧЕНЬ большое количество раз в цикле, это может повлиять на производительность. Тем не менее, вставка его с самого начала, вероятно, не очень хорошая идея.

2 голосов
/ 08 февраля 2012

Если (и только если) у вас возникли проблемы с производительностью, оцените время самостоятельно:

% python -m timeit -c '
statement1 = True
statement2 = True
statement3 = True

def perform():
    pass

def check():
    if (statement1 and
        statement2 and
        statement3):
        return True
    else:
        return False

def doIt():
    if check():
        perform()

doIt()
'
1000000 loops, best of 3: 1.37 usec per loop

Если у вас нет проблем с производительностью, следуйте инструкциям ZenPython и помните , что сказал Дональд Кнут о преждевременной оптимизации .

0 голосов
/ 08 февраля 2012

Я полагаю, что, исходя из своих базовых знаний в области программного обеспечения, вызов функции будет стоить дополнительных усилий, а затем кодироваться непосредственно в боковом блоке.

Обычно вызов функции должен записывать текущий указатель кодирования для последующего возврата из вызова функции.

Функция должна сделать ваш код более читабельным, а повторно используемую функцию легко отлаживать и поддерживать.

...