在Python中对1M记录进行排序的最佳方法

sbe*_*rry 7 python

我有一个运行的服务,它包含大约1,000,000个字典的列表,并执行以下操作

myHashTable = {}
myLists = { 'hits':{}, 'misses':{}, 'total':{} }
sorted = { 'hits':[], 'misses':[], 'total':[] }
for item in myList:
  id = item.pop('id')
  myHashTable[id] = item
  for k, v in item.iteritems():
    myLists[k][id] = v
Run Code Online (Sandbox Code Playgroud)

所以,如果我有以下词典列表:

[ {'id':'id1', 'hits':200, 'misses':300, 'total':400},
  {'id':'id2', 'hits':300, 'misses':100, 'total':500},
  {'id':'id3', 'hits':100, 'misses':400, 'total':600}
]
Run Code Online (Sandbox Code Playgroud)

我结束了

myHashTable =
{ 
  'id1': {'hits':200, 'misses':300, 'total':400},
  'id2': {'hits':300, 'misses':100, 'total':500},
  'id3': {'hits':100, 'misses':400, 'total':600}
}
Run Code Online (Sandbox Code Playgroud)

myLists = 

    {
      'hits': {'id1':200, 'id2':300, 'id3':100},
      'misses': {'id1':300, 'id2':100, 'id3':400},
      'total': {'id1':400, 'id2':500, 'id3':600}
    }
Run Code Online (Sandbox Code Playgroud)

然后,我需要对每个myLists词典中的所有数据进行排序.

我目前正在做的事情如下:

def doSort(key):
  sorted[key] = sorted(myLists[key].items(), key=operator.itemgetter(1), reverse=True)

which would yield, in the case of misses:
[('id3', 400), ('id1', 300), ('id2', 200)] 
Run Code Online (Sandbox Code Playgroud)

当我有大约100,000条记录时,这很有效,但是有1,000,000条,至少需要5到10分钟才能对每条记录进行排序,总共16条(我原来的字典列表实际上有17个字段,包括弹出的id)

*编辑*此服务是ThreadingTCPServer,它有一个允许客户端连接和添加新数据的方法.新数据可能包括新记录(意味着对已经在内存中具有唯一"id"的字典)或修改后的记录(意味着具有其他键值对的不同数据的相同"id"

所以,一旦这个运行,我会传入

[
  {'id':'id1', 'hits':205, 'misses':305, 'total':480},
  {'id':'id4', 'hits':30, 'misses':40, 'total':60},
  {'id':'id5', 'hits':50, 'misses':90, 'total':20
]
Run Code Online (Sandbox Code Playgroud)

我一直在使用字典来存储数据,这样我就不会有重复数据了.在使用新的/修改的数据更新字典后,我会使用它们.

*结束编辑*

那么,对我进行排序的最佳方式是什么?有更好的方法吗?

Osc*_*Ryz 13

你可以从Guido找到这个相关的答案: 使用Python在2MB RAM中排序一百万个32位整数