Скорость форматирования строки в каркасе Python3 - PullRequest
0 голосов
/ 03 декабря 2018

Я широко использую logger.debug в своем приложении, есть ли способ запретить python форматировать мои строки при изменении уровня журнала?

Я запустил этот тест:

import time
import sys
import logging

logger = logging.getLogger('example_logger')
logger.setLevel(logging.INFO)

#handler = logging.StreamHandler(sys.stdout)       
handler = logging.NullHandler()      
handler.setLevel(logging.ERROR)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler)
st_time = time.time()
for i in range(0, 100000):
    logger.info("Test {} - {} - {}".format("bar", 43, "foobar"))
    logger.error("Test {} - {} - {}".format("bar", 43, "foobar"))
print("--- %s seconds ---" % (time.time() - st_time))

st_time = time.time()
for i in range(0, 100000):
    logger.info("Test %s - %d - %s", "bar", 43, "foobar")
    logger.error("Test %s - %d - %s", "bar", 43, "foobar")
print("--- %s seconds ---" % (time.time() - st_time))

st_time = time.time()
for i in range(0, 100000):
    if handler.level is logging.INFO:
        logger.info("Test {} - {} - {}".format("bar", 43, "foobar"))
    logger.error("Test {} - {} - {}".format("bar", 43, "foobar"))
print("--- %s seconds ---" % (time.time() - st_time))

и вот результат:

--- 1.9106299877166748 seconds ---
--- 1.7931029796600342 seconds ---
--- 0.9742612838745117 seconds --

Я ожидал, что второй тест будет таким же быстрым, а последний, но, очевидно, python все еще форматирует строку в logger.info, даже если этот уровень равенотключено.

Есть ли лучший способ достижения последнего результата без использования if?

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