А наивный ответ на «напиши простой аналог lru_cache»:
Хз, кто вам там что пишет без вытеснения
Простейшая реализация на OrderedDict:
pythonfrom collections import OrderedDict
from functools import wraps
def lru_cache(maxsize=128):
def decorator(func):
cache = OrderedDict()
@wraps(func)
def wrapper(*args, **kwargs):
key = (args, tuple(sorted(kwargs.items())))
if key in cache:
cache.move_to_end(key) # отметить как недавно использованный
return cache[key]
result = func(*args, **kwargs)
cache[key] = result
if maxsize is not None and len(cache) > maxsize:
cache.popitem(last=False) # выкинуть самый старый
return result
return wrapper
return decorator
Использование:
python@lru_cache(maxsize=2)
def slow_square(n):
print(f"вычисляю {n}")
return n * n
slow_square(2) # вычисляю 2
slow_square(2) # из кеша
slow_square(3) # вычисляю 3
slow_square(4) # вычисляю 4 — теперь 2 вытеснен
slow_square(2) # вычисляю 2 (снова)
Ключевые моменты этой реализации:
OrderedDict поддерживает порядок вставки, а move_to_end позволяет дёшево обновлять «свежесть» элемента — это и есть суть LRU. При переполнении popitem(last=False) удаляет самый давно использованный.
Формирование ключа (args, tuple(sorted(kwargs.items()))) — упрощённое. Настоящий functools.lru_cache использует _make_key, который аккуратнее обрабатывает порядок аргументов и типы. Здесь есть ограничение: все аргументы должны быть хешируемыми (как и в оригинале).
Если хочется ближе к оригиналу — добавить статистику и метод сброса:
pythonfrom collections import OrderedDict
from functools import wraps
def lru_cache(maxsize=128):
def decorator(func):
cache = OrderedDict()
hits = misses = 0
@wraps(func)
def wrapper(*args, **kwargs):
nonlocal hits, misses
key = (args, tuple(sorted(kwargs.items())))
if key in cache:
cache.move_to_end(key)
hits += 1
return cache[key]
misses += 1
result = func(*args, **kwargs)
cache[key] = result
if maxsize is not None and len(cache) > maxsize:
cache.popitem(last=False)
return result
def cache_info():
return {"hits": hits, "misses": misses,
"maxsize": maxsize, "currsize": len(cache)}
def cache_clear():
nonlocal hits, misses
cache.clear()
hits = misses = 0
wrapper.cache_info = cache_info
wrapper.cache_clear = cache_clear
return wrapper
return decorator
Стоит иметь в виду: настоящий functools.lru_cache написан на C, потокобезопасен (блокировка вокруг обновления кеша) и использует кольцевой двусвязный список вместо OrderedDict. Для учебных целей и однопоточного кода версия выше эквивалентна по поведению; для многопоточности нужно обернуть доступ к cache в threading.Lock.
А что делает живой копирайтер? Он пишет конкретику, которую можно проверить: сколько часов держит зарядка, за сколько секунд коннектится, что слышно, а что нет. И — самое важное — он называет недостаток.
Хахахахахахахаххахахахахахах. Ххахаах. Ха-ха. Нет.
В каком блин месте он сильный? Это дефолтная жвачка от ллмки, в которой повторяются стандартные нарративы аналитиков, которые просто рисуют график “в будущее”.
Ну и в целом чтобы придумать как именно это решать даже с небольшими ресурсами надо десяток лет пожить с этой ошибкой в проде. Щас-то с послезнанием хорошо говорить “это было ошибкой”.
@moderator как там насчет запрета на ИИ-контент? Статья — чистая генерация же.
Что вы несете за чушь? У вас половина текста обороты ллм, причем тут невозможность (!) юридически (!!) передать диалог дословно?
Ахахаха, а вы текст на этой же видеокарте генерировали или нет?
Да, очень хорошо и понятно обьяснено.
Ну, т.е. мы переходим от критики ллмок как таковых к критике плохих кодеров, я правильно понял?
Возможно и нейросеть найдет ошибки в коде. "в русалок верю, в домовых"
Когда в мск вдруг врубили белые списки, я бы очень рад был любому каналу, лишь бы узнать адреса серверов которые работают
Хз, кто вам там что пишет без вытеснения
Хахахахахахахаххахахахахахах. Ххахаах. Ха-ха. Нет.
То там появится еще один ноль при передаче.
Ну не под заказ, просто поставки расписаны на несколько лет вперед, быстрее собирать и монтировать не могут.
В каком блин месте он сильный? Это дефолтная жвачка от ллмки, в которой повторяются стандартные нарративы аналитиков, которые просто рисуют график “в будущее”.
Ура. Интересно, насколько будет соблюдаться в корпоративных блогах.
Но вы же и правда школьник, который пишет нейрослоп
Ну и в целом чтобы придумать как именно это решать даже с небольшими ресурсами надо десяток лет пожить с этой ошибкой в проде. Щас-то с послезнанием хорошо говорить “это было ошибкой”.
Описанное в статье не является публичным мнением должностных лиц компании. Это не инвестиционная рекомендация.
Меня терзают смутные сомненья. А старого вы куда предлагаете деть?
А ведь нас предупреждали что это половина книги..
А вы можете сказать где заканчивается серьезный спор и начинаются передергивания?
Контора сами знаете кого