Лучший способ хранения объектов для обеспечения быстрого доступа?

#python

#python

Вопрос:

Хорошо, я пробую еще раз, извините, если я был неясен, это была моя первая попытка спросить здесь что-то.

 # I have such class
# p1 is immutable and uniq. It's using for search
# p2 is mutable parameter
class SomeHashableObject():
    def __init__(self, p1)
        self.p1 = p1
        self.p2 = []

    def __hash__(self):
        return hash(self.p1)

    def __eq__(self, other):
        return self.p1==other.p1
  

Например, у меня есть 2 разных SomeHashableObject.

 #Creating and saving
obj_1 = SomeHashableObject(1)
obj_1.p2 = ['a', 'b']
obj_2 = SomeHashableObject(4)
obj_2.p2 = ['c', 'd']
  

Теперь я хочу сохранить свои объекты, а затем найти тот, где p1 = 4

Первый способ сохранения и поиска (список)

 # Storing
obj_list = [obj_1, obj_2]
# Searching
result = next(obj for obj in obj_list if obj.p1==4)
  

Второй способ хранения и поиска (хэш-таблица)

 # Storing
obj_dict = {
    obj_1: obj_1,
    obj_2: obj_2
}
# Searching
obj_to_search = SomeHashableObject(4)
result = obj_dict[obj_to_search]
  

Является ли второй способ приемлемым (или лучше)?
Надеюсь, теперь все понятно)

Комментарии:

1. Я не понимаю, чего вы пытаетесь достичь. dictionary[obj_to_find].obj_attribute У вас уже есть obj_to_find , зачем вам нужен поиск dict, dictionary[obj_to_find] который вернет точно то же самое obj_to_find ?

2. Обычно ключ и значение в словаре разные. В противном случае, если у вас уже есть объект, зачем искать его в словаре? Возможно, ваш класс странный в том смысле, что экземпляры, которые кажутся одинаковыми, отличаются в деталях, но в данном случае это привело к запутыванию кода.

3. Вероятно, было бы более полезно иметь {'some_key': obj_to_find} , иначе вам нужен объект для поиска объекта, что не имеет смысла

4. @HFBrowning Например, если хэш вычислялся медленно, было много столкновений или коллекция была очень маленькой.

5. @Monitor-1 потому что значение хэша — это не то, что используется в качестве подстановки в словаре . Хешируемый объект является . Вы могли бы взломать свой путь к внутренним компонентам CPython и попытаться сделать это. Или вы могли бы просто создать нужную вам карту напрямую . Какими бы ни были ваши «первичные ключи», просто используйте их как объект, который будет прямым ключом. Наличие dict, который просто сопоставляет объект самому себе, не имеет смысла