diff --git a/homeassistant/helpers/event.py b/homeassistant/helpers/event.py index 3d51610010c..f689f15725d 100644 --- a/homeassistant/helpers/event.py +++ b/homeassistant/helpers/event.py @@ -401,9 +401,6 @@ def _async_track_event( if not keys: return _remove_empty_listener - if isinstance(keys, str): - keys = [keys] - hass_data = hass.data callbacks_key = tracker.callbacks_key @@ -422,11 +419,23 @@ def _async_track_event( job = HassJob(action, f"track {tracker.event_type} event {keys}", job_type=job_type) - for key in keys: - if callback_list := callbacks.get(key): + if isinstance(keys, str): + # Almost all calls to this function use a single key + # so we optimize for that case. We don't use setdefault + # here because this function gets called ~20000 times + # during startup, and we want to avoid the overhead of + # creating empty lists and throwing them away. + if callback_list := callbacks.get(keys): callback_list.append(job) else: - callbacks[key] = [job] + callbacks[keys] = [job] + keys = [keys] + else: + for key in keys: + if callback_list := callbacks.get(key): + callback_list.append(job) + else: + callbacks[key] = [job] return ft.partial(_remove_listener, hass, listeners_key, keys, job, callbacks)