Хотя подобные вопросы задавали и другие, например. Заголовок здесь, но они немного отличались и на самом деле не решили мою проблему, так что вот еще раз.
У меня есть N списков (N> 20 000), и каждый список содержит M списков ( M> 20 000) следующим образом (данные являются фиктивными):
Key1: [ [4,3,1], [5,1,0] ...... [43,21,0 ] ] # List 1 with collection of M smaller lists
:
:
KeyN: [ [5,4,1], [55,1,1] ...... [ 221, 0, 0] ] # Nth list
Данные не отсортированы. Перебирая список пороговых значений один за другим, скажем, Threshold =[2, 3, 5, 7, 8]
, где порог применяется к среднему элементу, я хочу извлечь все элементы для всех ключей, превышающие пороговое значение. Например исходя из данных, которые я написал выше, Threshold = 2
даст
For Key1: [ [4,3,1], [43,21,0]]
:
:
For KeyN: [[5,4,1]]
И аналогично для других пороговых значений. Поскольку списков слишком много, мое наблюдение заключается в том, что сортировка приводит к большим накладным расходам, и поэтому я хочу ее избежать. Каков оптимальный способ сделать это в python?. Еще один важный момент заключается в том, что я сам создаю данные, поэтому, возможно, для начала существует лучшая структура данных для хранения данных. В настоящее время я храню данные в форме PersistentList
в контейнере Btree
в ZODB
, что было предложено здесь . Ниже приведен фрагмент кода, используемого для этого:
for Gnodes in G.nodes(): # Gnodes iterates over N values
Gvalue = someoperation(Gnodes)
for Hnodes in H.nodes(): # Hnodes iterates over N values
Hvalue =someoperation(Hnodes,Gnodes)
score = SomeOperation on (Gvalue,Hvalue)
btree_container.setdefault(Gnodes, PersistentList()).append([Hnodes, score, -1 ])
transaction.savepoint(True)
transaction.commit()
Любые предложения о том, что должно быть наиболее эффективным способом сделать это? Является ли сортировка первой действительно оптимальным способом?
savepoint()
. Элементы во внутреннем меньшем списке имеют следующий формат:[int, float, zero or 1]
. Диапазон переменнойint
составляет от 0 до M, и все целые числа между ними уже отображаются в порядке возрастания, то есть от 0 до M из-за способа записи данных. - person R.Bahl   schedule 01.07.2012