【发布时间】:2009-07-24 21:25:24
【问题描述】:
我有一个运行的服务,它获取大约 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
所以,如果我有以下字典列表:
[ {'id':'id1', 'hits':200, 'misses':300, 'total':400},
{'id':'id2', 'hits':300, 'misses':100, 'total':500},
{'id':'id3', 'hits':100, 'misses':400, 'total':600}
]
我结束了
myHashTable =
{
'id1': {'hits':200, 'misses':300, 'total':400},
'id2': {'hits':300, 'misses':100, 'total':500},
'id3': {'hits':100, 'misses':400, 'total':600}
}
和
myLists =
{
'hits': {'id1':200, 'id2':300, 'id3':100},
'misses': {'id1':300, 'id2':100, 'id3':400},
'total': {'id1':400, 'id2':500, 'id3':600}
}
然后我需要对每个 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)]
当我有多达 100,000 条左右的记录时,这很有效,但是如果有 1,000,000 条记录,则至少需要 5 - 10 分钟才能对总共 16 条记录进行排序(我原来的字典列表实际上有 17 个字段,其中 id 是弹出)
* EDIT * 这个服务是一个 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 ]我一直在使用字典 存储数据,这样我就不会结束 有重复。之后 字典更新为 新的/修改过的数据我都使用了 他们。
* 结束编辑 *
那么,我对这些进行排序的最佳方法是什么?有没有更好的方法?
【问题讨论】:
-
这可能不是您要寻找的答案,但使用纯 Python 处理如此大量的数据通常不是一个好主意。当您需要执行大量小操作(例如,排序期间的比较)时,它不是为提高性能而设计的。
-
@Pavel,你错了:Python 的排序 (timsort) 可能是可用的最快的内存排序。 Josh Bloch 在 Google 的一次技术演讲中看到了它的解释,并立即开始将其编码为下一个 Java 版本的内部排序;见bugs.sun.com/bugdatabase/view_bug.do?bug_id=6804124和svn.python.org/projects/python/trunk/Objects/listsort.txt
-
@alex,你知道哪个技术讲座吗?不是我怀疑你。它刚刚达到了我的兴趣。 :)
-
排序本身可以使用已知最快的算法来实现。但是,如果对于列表中的每个元素,它必须首先检索用于排序的键,这有什么关系。
标签: python