2015-05-23 4 views
0

Предположим, у меня есть следующий код:Python ленивая оценка?

def my_func(input_line): 

    is_skip_line = self.is_skip_line(input_line) # parse input line check if skip line 

    if is_skip_line: 
     # do something... 

    # do more ... 

    if is_skip_line: 
     # do one last thing 

Так у нас есть чек на is_skip_line (если is_skip_line:), который появляется в два раза. Означает ли это, что из-за ленивой оценки метод self.is_skip_line (input_line) будет вызываться дважды?

Если да, то чем лучше всего работать, учитывая, что self.is_skip_line (input_line) занимает много времени? Должен ли я «немедленно вызвать» его, как показано ниже?

is_skip_line = (lambda x: self.is_skip_line(x))(input_line) 

Thanks.

+7

Это не лениво оценивающая инструкция в Python. Единственная ситуация, в которой Python лениво оценивает, - это генераторы. 'self.is_skip_line (input_line)' будет оцениваться только один раз. – jwilner

+1

'is_skip_line' оценивается дважды, но' self.is_skip_line (input_line) 'оценивается только один раз. – TigerhawkT3

+2

Почему вы думаете, что завершение вызова функции в лямбда, а затем применение ее к аргументу, было бы менее ленивым, чем просто применение вызова? – chepner

ответ

1

Заблуждение здесь является то, что это утверждение не сразу вызывается:

is_skip_line = self.is_skip_line(input_line) 

... когда на самом деле, это является.

Метод self.is_skip_line будет вызываться только один раз. Поскольку вы назначаете его переменной, вы можете использовать эту переменную столько раз, сколько хотите в любом контексте.

Если вы обеспокоены его выполнением, вы можете использовать cProfile, чтобы действительно проверить производительность метода, который он вызвал, в отношении метода, который он вызывает.

Смежные вопросы