У меня есть следующий код в Python:
def point_to_index(point):
if point not in points:
points.append(point)
return points.index(point)
Этот код ужасно неэффективен, тем более что я ожидаю, что points
будет содержать несколько миллионов элементов.
Если точки нет в списке, я пересекаю список 3 раза:
- найдите и решите, что его там нет
- перейти в конец списка и добавить новый элемент
- идти до конца списка, пока не найду индекс
Если это в списке , я перейду его дважды:
1. найдите и решите, что это там
2. идти почти до конца списка, пока не найду индекс
Есть ли более эффективный способ сделать это? Например, я знаю, что:
- Я с большей вероятностью вызову эту функцию с точкой, которой нет в списке.
- Если точка находится в списке, скорее всего, ближе к концу, чем в начале.
Так что, если бы у меня была строка:
if point not in points:
поиск в списке с конца до начала, это улучшит производительность, когда точка уже находится в списке.
Однако я не хочу делать:
if point not in reversed(points):
потому что я представляю, что reversed(points)
само по себе будет стоить огромных затрат.
Также я не хочу добавлять новые точки в начало списка (при условии, что я знал, как это сделать в Python), поскольку это изменило бы индексы, которые должны оставаться постоянными, чтобы алгоритм работал.
Единственное улучшение, которое я могу придумать, - это реализовать функцию всего за один проход, если это возможно от конца до начала. Нижняя строка:
- Есть ли хороший способ сделать это?
- Есть ли лучший способ оптимизировать функцию?
Редактировать: Я получил предложения по реализации этого всего за один проход. Есть ли способ для index()
пройти от конца к началу?
Редактировать: Люди спрашивают, почему индекс является критическим. Я пытаюсь описать трехмерную поверхность, используя OFF формат файла . Этот формат описывает поверхность, используя ее вершины и грани. Сначала перечисляются вершины, а грани описываются с использованием списка индексов вершин. Вот почему, когда я добавляю вихрь в список, его индекс не должен меняться.
Редактировать: Были некоторые предложения (например, igor's ) использовать диктовку. Это хорошее решение для сканирования списка. Однако, когда я закончу, мне нужно распечатать список в том же порядке, в котором он был создан. Если я использую dict, мне нужно распечатать ключи, отсортированные по значению. Есть ли хороший способ сделать это?
Редактировать: Я реализовал www.brool.com предложение . Это было самым простым и быстрым. По сути, это заказанный Dict, но без накладных расходов. Производительность отличная!