Skip to content

Optimize logging.getHandlerNames() #107710

Closed
@sobolevn

Description

@sobolevn

Right now this function is not optimal. Source:

def getHandlerNames():
    """
    Return all known handler names as an immutable set.
    """
    result = set(_handlers.keys())
    return frozenset(result)

Why? _handlers.keys() already returns set-like thing, so there's no need to use extra set()

It can be simplified to:

def getHandlerNames():
    """
    Return all known handler names as an immutable set.
    """
    return frozenset(_handlers.keys())

This simple benchmark (with only two handlers) gives a noticable improvement:

import logging

# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# create two handlers
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)

fl = logging.FileHandler('./log.txt')
fl.setLevel(logging.DEBUG)
fl.setFormatter(formatter)
logger.addHandler(fl)

Before:

(.venv) ~/Desktop/cpython  main ✗                                                         
» pyperf timeit --setup 'import ex; l = ex.logging' 'l.getHandlerNames()'
.....................
Mean +- std dev: 2.13 us +- 0.02 us

After:

(.venv) ~/Desktop/cpython  main ✗                                                         
» pyperf timeit --setup 'import ex; l = ex.logging' 'l.getHandlerNames()'
.....................
Mean +- std dev: 2.04 us +- 0.02 us

So, I think we should make this change :)
PR is incoming.

Linked PRs

Metadata

Metadata

Assignees

Labels

performancePerformance or resource usagetype-featureA feature request or enhancement

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions