Ленивая оценка строк в журнале Python: сравнение `%` с `.format` - PullRequest
0 голосов
/ 25 августа 2018

Есть ли разница между этими двумя вызовами:

import logging

logging.getLogger().debug('test: %i' % 42)

и

logging.getLogger().debug('test: {}'.format(42))

Где мы предполагаем, что 42 заменяется некоторыми длинными вычислениями при приведении к строке (7.5миллион лет, например), что дает окончательный ответ 42.

Лениво ли оценивается прежний подход в случае, если ведение журнала настроено на отладку?

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Никто не ленив. Обе строки интерполируются перед отправкой в ​​регистратор. Ленивая оценка с точки зрения регистрации Python выполняется с отдельными аргументами. Документация https://docs.python.org/2/library/logging.html предлагает следующее для ленивой оценки интерполяции строки:

logging.getLogger().debug('test: %i', 42)

TL; DR В этом случае проще учитывать следующее. Мы отправили примитивный тип (строку), но только один аргумент в журнал. Таким образом, это не может быть ленивым.

0 голосов
/ 25 августа 2018

Я бы посмотрел ссылки, которые я разместил в комментариях, для более подробной информации о % и .format().

Для ленивого оценочного вопроса ответом будет нет .

Простой тест сделает

def func1(x):
    time.sleep(5)
    return(x)

def func2(x):
    #time.sleep(5)
    return(x)

%timeit 'debug1: %s' % func1(3)
5 s ± 1.31 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit 'debug2: {}'.format(func1(3))
5 s ± 1.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit 'debug1: %s' % func2(3)
297 ns ± 11.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit 'debug2: {}'.format(func2(3))
404 ns ± 4.56 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

В обоих .format (очевидно,) и % подходы, func() вычисляется в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...