当前位置: 首页 > 面试题库 >

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

南门志
2023-03-14
问题内容

我有一个运行的服务,该服务接受约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)

编辑
此服务是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
]

我一直在使用字典来存储数据,以免出现重复。用新的/修改的数据更新字典后,我将对每个字典进行重新排序。

结束编辑

那么,对我来说最好的分类方式是什么?有没有更好的方法?


问题答案:

您可以从Guido中找到以下相关答案: 使用Python在2MB
RAM中对一百万个32位整数进行排序



 类似资料:
  • 问题内容: 我有两个与ElasticSearch有关的问题。 1)有什么方法可以指定我想要特定字段的结果以降序排列吗?等效SQL查询为: 2)如何获得第一和最后(最新)记录? 问题答案: 1)Elasticsearch具有相当完善的Sorting API ,可让您控制排序顺序。因此,在elasticsearch中,等效于您的MySql查询如下所示: 排序也可以在_search URI上指定。 2)

  • 以下是我的一些疑问: 我有两个不同的流,元素按顺序排列。 1)现在,当我在这些流中的每一个上执行时,会维护顺序吗?(因为这里的每个组都将仅发送给一个任务管理器)我的理解是,记录将是一个组的顺序,在这里纠正我。 2) 在这两个流上执行按键操作后,我正在进行联合分组,以获取匹配和非匹配记录。这里也会维持秩序吗?,因为这也适用于KeyedStream。我正在使用事件时间(EventTime)和上升时间(

  • 问题内容: 我正在尝试让Celery日志记录与一起使用Django。我已经登录设置进入控制台(在上托管时效果很好Heroku)。在每个模块的顶部,我有: 在我的task.py中,我有: 这对于记录来自任务的调用非常有效,并且我得到如下输出: 但是,如果那个任务然后在另一个模块中调用一个方法,例如一个方法,我将得到重复的日志条目,例如 我想我可以用 只是使用Django日志记录,但是当我尝试使用它时

  • 这是我在我的存储库中的查询,我使用的数据库是mysql。 现在我的要求是获取顶部的最新记录,按created_at排序

  • 问题内容: 我正在使用hibernate+播放!框架在工作中,是否有使用“hibernate”插入大量记录的“最佳实践”?每个文本文件大约有6,000到10,000个,所以我不知道Hibernate是否会扼杀工作或引发异常。 任何建议都让我知道,如果需要进一步说明,请告诉我 问题答案: 在* Java Persistence and Hibernate(Manning)中,并在Pangea的评论之

  • 问题内容: 我正在使用休眠+播放!框架在工作中,是否有使用“休眠”插入大量记录的“最佳实践”?每个文本文件大约有6,000到10,000个,所以我不知道Hibernate是否会扼杀工作或引发异常。 任何建议都让我知道,如果需要进一步说明,请告诉我 问题答案: 在* Java Persistence and Hibernate“(Manning)中,并在Pangea的评论之后,使用无状态会话(它没有