Я не понимаю, почему ваши "весовые" поиски должны иметь форму ["weight"]
(узлы - это словари?) Вместо .weight
(узлы - это объекты).
Если ваши узлы являются объектами и не имеют большого количества полей, вы можете воспользоваться директивой __slots__
для оптимизации их хранения:
class Node(object):
# ... class stuff goes here ...
__slots__ = ('weight',) # tuple of member names.
РЕДАКТИРОВАТЬ: Итак, я посмотрел на ссылку NetworkX, которую вы предоставили, и есть несколько вещей, которые меня беспокоят. Во-первых, в самом верху определение «словарь» - «FIXME».
В целом, кажется, настаивает на использовании словарей, а не на использовании классов, которые можно разделить на подклассы, для хранения атрибутов. Хотя поиск атрибутов на объекте может быть по сути поиском по словарю, я не вижу, как работа с объектом может быть хуже . Во всяком случае, это может быть лучше , поскольку поиск атрибутов объекта с большей вероятностью будет оптимизирован, потому что:
- поиск атрибутов объекта настолько распространен,
- пространство ключей для атрибутов объекта гораздо более ограничено, чем для словарных ключей, поэтому при поиске можно использовать оптимизированный алгоритм сравнения, а
- объекты имеют оптимизацию
__slots__
именно для этих случаев, когда у вас есть объект только с несколькими полями и вам требуется оптимизированный доступ к ним.
Я часто использую __slots__
в классах, которые представляют координаты, например. Узел дерева может показаться мне еще одним очевидным применением.
Так вот почему, когда я читаю:
узел
Узлом может быть любой хешируемый объект Python, кроме None.
Я думаю, хорошо, нет проблем, но затем сразу следует
атрибут узла
Узлы могут иметь произвольные объекты Python, назначенные в качестве атрибутов с помощью пар ключевое слово / значение при добавлении узла или назначении словаря атрибутов G.node [n] для указанного узла n.
Я думаю, если узлу нужны атрибуты, почему он будет храниться отдельно? Почему бы просто не положить его в узел? Вредно ли написание класса с членами contentString
и weight
? Края кажутся еще более безумными, поскольку они должны быть кортежами, а не объектами, которые вы можете подклассить.
Так что я довольно заблудился относительно проектных решений, стоящих за NetworkX.
Если вы застряли с этим, я бы порекомендовал перенести атрибуты из этих словарей в фактические узлы, или, если это не вариант, использовать целые числа для ключей в вашем словаре атрибутов вместо строк, так что поиск использует намного быстрее алгоритм сравнения.
Наконец, что если вы объединили свои генераторы:
neighbor_z_scores = (interaction_graph.node[neighbor]['weight'] for
neighbor in node_neighbors if neighbor in selected_nodes)