У меня есть класс с именем Point
, который имеет только x_coordinate
и y_coordinate
с плавающей точкой в качестве своих атрибутов. У меня есть около 700000 объектов Point, которые я хотел бы сохранить в словаре.
Ключи словаря - это Point
объекты, а соответствующие значения - Region
объектов, которые содержат в себе около тысячи точек. По сути, ключ p
принадлежит значению r
, означающему, что точечный объект принадлежит конкретному объекту региона.
Короче говоря, это примитивный цикл, который я пытаюсь выполнить:
look_up_table = {}
for region in all_regions_list:
for point in region.points_list:
look_up_table[point] = region
Во всех регионах есть около 700000 объектов Point, уже загруженных в память. Таким образом, четвертая строка в коде, вероятно, будет выполнена 700 000 раз, а в словаре будет около 700 000 пар (ключ, значение).
Скажем, каждый объект Point занимает 1 КБ памяти (что на самом деле невозможно), а 700 000 точек занимают около 680 МБ. И у меня есть более 3 ГБ свободной оперативной памяти. Более того; эти объекты Point и Region уже загружены в память ...
Тем не менее, эти простые 4 строки занимают целую вечность, я ждал около 2 часов и не повезло ... Требуется около часа, чтобы хэшировать только 10k объектов ...
Итак, мой вопрос: я что-то не так делаю? Есть ли другой способ сохранить 700 тыс. Объектов в памяти и найти определенный ключ за O (1) раз?
Кстати, ниже приведены переопределенные методы класса Point
:
def __hash__(self, *args, **kwargs):
""" overriden hash method """
hashcode = 133
hashcode = hashcode * 23 + self.x_coordinate
hashcode = hashcode * 23 + self.y_coordinate
return hashcode
def __eq__(self, other):
""" overriden equals method """
if not other:
return False
else:
return self.__cmp__(other) == 0
def __cmp__(self, other):
""" overriden compare method """
if other is not None:
origin = Point(0.0, 0.0)
if self.distance_between(origin) < other.distance_between(origin):
return - 1
elif self.distance_between(origin) > other.distance_between(origin):
return 1
else:
return 0
Заранее спасибо ...