Допустим, у меня есть список объектов. (Теперь все вместе: «У меня есть список объектов».) В веб-приложении, которое я пишу, каждый раз, когда приходит запрос, я выбираю один из этих объектов в соответствии с неуказанными критериями и использую его для обработки запрос. В основном так:
def handle_request(req):
for h in handlers:
if h.handles(req):
return h
return None
Предполагая, что порядок объектов в списке не важен, я могу сократить ненужные итерации, сохранив список отсортированным таким образом, чтобы наиболее часто используемые (или, возможно, недавно использовавшиеся) объекты находились спереди. Я знаю, что это не то, о чем нужно беспокоиться - это приведет к незначительной, незаметной разнице во времени выполнения приложения - но отладка остальной части кода сводит меня с ума, и мне нужно отвлекаться :), так что я из любопытства: какой самый эффективный способ сохранить список в отсортированном порядке, по убыванию, по количеству раз, когда выбран каждый обработчик?
Очевидное решение - создать handlers
список из (count, handler)
пар, и каждый раз при выборе обработчика увеличивать счетчик и прибегать к списку.
def handle_request(req):
for h in handlers[:]:
if h[1].handles(req):
h[0] += 1
handlers.sort(reverse=True)
return h[1]
return None
Но так как когда-либо будет только один элемент из строя, и я знаю, какой это будет элемент, похоже, что какая-то оптимизация должна быть возможной. Может быть, в стандартной библиотеке есть что-то, что особенно хорошо подходит для этой задачи? Или какая-то другая структура данных? (Даже если это не реализовано в Python) Или я должен / мог бы сделать что-то совершенно другое?