Эффективный кольцевой буфер с постоянным доступом
В проекте машинного обучения, написанном на Python, мне нужен эффективный кольцевой буфер, например collections.deque
но с постоянным доступом к любому элементу, например numpy.array
. Проблема в том, что deque, по-видимому, является связанным списком. Есть ли что-то эффективное, легко реализуемое в библиотеке Python, о котором я не знаю для этого варианта использования, пожалуйста?
Я мог бы просто модифицировать фиксированный размер numpy.array
с движущимся индексом 0 в моем варианте использования, я думаю, но это для моей культуры Python, так как это не первый раз, когда мне нужно что-то подобное.
2 ответа
The numpy_ringbuffer
Модуль по адресу https://pypi.org/project/numpy-ringbuffer/ использует буферы, поддерживаемые массивом NumPy. Он должен удовлетворять вашим требованиям к эффективности.
collections.deque
не совсем связанный список. Это двусвязный список массивов размером 64. Я бы сказал, что это довольно приличный выбор, если вам нужен как произвольный доступ, так и добавление на обоих концах без постоянного перераспределения.
Однако, если вы выполнили правильное профилирование производительности и этот кольцевой буфер действительно является вашим узким местом, вы можете реализовать буфер на простом C для повышения производительности и добавить привязки к python.