Метка: оптимизация python

Удаление ключа из словаря

Выдирает страницу из словаря

Словарь (dict) – изменяемый тип в Python. Из словаря можно легко удалить ключ оператором del:

>>> d = {"foo":123, "bar":321}
>>> del d["foo"]
>>> d
{'bar': 321}

Что если ключа не окажется в словаре? Ответ: исключение – KeyError:

>>> del d['baz']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'baz'

Конечно, можно сделать так:

if 'baz' in d:
    del d['baz']

Или даже так:

try:
    del d['baz']
except KeyError:
    pass

Однако, есть способ удалить ключ (которого возможно нет) в одну строчку:

d.pop('baz', None)

Обратите внимание, что второй аргумент None обязателен. Кроме того, метод pop вернет удаленный элемент, что может быть полезно в каких-то случаях.

🧙 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈 

Что быстрее? dict() или {}

Разработчики предпочитают разные способы создания пустого словаря. Но равнозначны ли они?

Оказывается, что нет. Они приводят к генерации разного байт-кода. Убедимся в этом с помощью модуля dis:

 >>> import dis
 >>> dis.dis('{}')
   1           0 BUILD_MAP                0
               2 RETURN_VALUE
 >>> dis.dis('dict()')
   1           0 LOAD_NAME                0 (dict)
               2 CALL_FUNCTION            0
               4 RETURN_VALUE 

В одном случае непосредственно используется одна команда BUILD_MAP для создания словаря, а в другом случае идет вызов функции dict, который где-то внутри себя делает BUILD_MAP.

Очевидно, это сказывается и на времени выполнения кода:

>>> from timeit import timeit
>>> timeit('{}')
0.03544308300479315
>>> timeit('dict()')
0.08697152900276706

Вывод: dict() – работает значительно медленнее. Не призываем переписывать старый код, просто на заметку.

🧙 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈 

LRU-кэш в одну строчку

Кэш нужен, чтобы запоминать результаты каких-то тяжелых операций: вычислений, доступа к диску или запросов в сеть. В Python есть отличный декоратор, чтобы элегантно снабдить вашу функцию кэшированием: @functools.lru_cache(maxsize=128, typed=False)