Зачем использовать списки для хранения предыдущих значений?
Что проверяют
Формулировка простая, но проверяют понимание сложности операций и расхода памяти: когда список подходит для истории значений, а когда нужен deque, массив NumPy или встроенные функции pandas. Следом часто просят посчитать скользящее среднее по потоку или спрашивают, почему память растёт во время обучения.
Как отвечать
Список в Python хорош для накопления истории: append() работает за амортизированное O(1), порядок сохраняется, доступ по индексу мгновенный. Типичные сценарии: история loss и метрик по эпохам для графиков и early stopping, лаги в собственном цикле, буфер предыдущих предсказаний.
Дальше покажите, где список перестаёт быть правильным выбором:
- последние N значений:
collections.deque(maxlen=N)сам выбрасывает старые элементы за O(1), аlist.pop(0)сдвигает весь список и стоит O(n); - числовые ряды: список хранит указатели на отдельные объекты
floatпо 24 байта каждый, а массивfloat64в NumPy тратит 8 байт на значение и считается векторно. Удобно копить в список и один раз вызватьnp.array()в конце, тогда какnp.append()в цикле копирует массив на каждом шаге; - табличные данные: лаги и окна в pandas делаются через
shift(),diff()иrolling(), по группам черезgroupby().shift(). Ручной цикл со списком медленнее и легко заглядывает в будущее, если данные не отсортированы по времени; - бесконечный поток: кольцевой буфер или накопительные статистики (сумма, счётчик, алгоритм Уэлфорда для дисперсии), чтобы память не росла.
Где спотыкаются
Складывают в список тензоры loss из PyTorch: history.append(loss). Вместе с тензором сохраняется граф вычислений, и память растёт с каждой итерацией. Нужно loss.item() или хотя бы loss.detach().
Кладут в историю изменяемый объект, который потом меняется на месте, например словарь параметров или веса модели. Все элементы списка указывают на один объект, и история состоит из одинаковых значений. Нужна копия.
Пишут def update(value, history=[]). Значение по умолчанию создаётся один раз при определении функции, и история тихо копится между вызовами.