Измерение времени
Сравним скорость создания объекта range и списка.
import time
start = time.time()
values = range(1_000_000)
elapsed_range = time.time() - start
start = time.time()
values_list = list(range(1_000_000))
elapsed_list = time.time() - start
print(f"range: {elapsed_range:.10f} сек")
print(f"list: {elapsed_list:.10f} сек")OrderedDict как очередь задач
Перемещаем задачи с высоким приоритетом в начало, а с низким — в конец.
from collections import OrderedDict
queue = OrderedDict([
("task1", "low"),
("task2", "high"),
("task3", "low"),
])
for key, value in list(queue.items()):
if "high" in value:
queue.move_to_end(key, last=False)
elif "low" in value:
queue.move_to_end(key)
print(queue)LRU-кэш на практике
Декоратор ускоряет рекурсивное вычисление чисел Фибоначчи.
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(35))
print(fibonacci.cache_info())frozenset как ключ словаря
Используем неизменяемое множество там, где обычный set не подходит.
frozen = frozenset(["read", "write"])
permissions = {frozen: "editor"}
print(permissions[frozen])Основные операции со словарём
Добавление, обновление, проверка ключа и удаление.
profile = {"name": "Alice", "age": 30}
profile["city"] = "Berlin"
profile.update({"age": 31, "email": "alice@example.com"})
if "email" in profile:
print(profile["email"])
removed = profile.pop("email")
print(f"Удалено: {removed}")
print(profile)Передача функции в функцию
Функцию можно передать как аргумент и вызвать внутри обёртки.
def double(x):
return x * 2
def apply(func, data):
return [func(x) for x in data]
print(apply(double, [1, 2, 3]))Lambda с сортировкой
Сортируем список кортежей по нескольким критериям.
people = [("Mike", 19), ("Nancy", 35), ("Oscar", 33), ("Frank", 33)]
by_age = sorted(people, key=lambda p: p[1])
by_age_name = sorted(people, key=lambda p: (-p[1], p[0]))
print(by_age)
print(by_age_name)