【问题标题】:Help with speeding up dictionary sort loop in Python?帮助加快 Python 中的字典排序循环?
【发布时间】:2011-11-05 16:58:00
【问题描述】:

我的代码中有一个非常丑陋的循环,这真的减慢了我的程序。该循环主要执行字典比较,如果dict_A 中的特定键与dict_B 中的特定键相同,则对所有匹配项执行排序,并将其写入文件。

for k, v in A_dict.items():
    for i, value in B_dict.items():
        if k == value[0]:
            sorted_B = [list(value) for key, value in groupby(sorted(B_dict.values()), key=itemgetter(1,2))]
            outfile.write('{0}\t{1}\t{2}\t{3}\t{4}\t{5}\n'.format (i, k, v, value[1], value[2], value[3])

不幸的是,这两个字典都包含超过一百万个项目。除了将这些数据放入数据库然后排序之外,有没有人对如何加快这个循环有任何建议?感谢您的帮助。

【问题讨论】:

  • 您的代码比较了一个键和一个值,但您的文本只描述了比较值。那么什么是“匹配”?价值观一样吗?此外,当您使用 items() 方法时,会创建一个全新的列表。您可以使用 A_dict 中的键直接从 B_dict 获取。
  • @Keith 感谢您的关注。希望我的问题现在很清楚 - 我正在将一个字典 (dict_A) 中的键与另一字典 (dict_B) 中的值匹配
  • 那么,当你有匹配的时候,你想写什么到文件中呢?
  • 当我匹配 k == value[0] 时,我正在写入文件中匹配的字典项中的一些其他值。
  • 好吧..那么你为什么要进行groupby/排序/列表理解呢?

标签: python performance sorting dictionary python-3.x


【解决方案1】:

您的示例代码可能不准确,但正如所写,

sorted_B = [list(value) for key, value in 
                groupby(sorted(B_dict.values()), key=itemgetter(2,3))]

每次都是一样的……为什么要循环呢?

还有

for k, v in A_dict.items():
    for i, value in B_dict.items():
        if k == value[0]:
            outfile.write('{0}\t{1}\t{2}\t{3}\t{4}\t{5}\n'.format(
                i, k, v, value[1], value[2], value[3])

貌似可以写成

for i, value in B_dict.items():
    k = value[0]
    if k in A_dict:
        outfile.write('{0}\t{1}\t{2}\t{3}\t{4}\t{5}\n'.format(
            i, k, A_dict[k], value[1], value[2], value[3])

哪个应该更快——它是线性时间而不是二次时间。

【讨论】:

  • 一如既往,感谢您的帮助。我试图将 sorted_B 放入循环中,以便只有 if k == value[0]: 需要排序的项目。
  • 您正在对整个字典进行排序,而不仅仅是匹配的项目。你想得到一个所有匹配项的列表然后排序吗?
  • 我不确定我是否理解您如何重写字典匹配循环 - 特别是,k = value[0].k 是字典的关键。这不会将 k 重新绑定到另一个字典中的 value[0] 。对不起,如果我不清楚。
  • 您需要更好地解释您要写入文件的内容。
  • 对于 dict_B 中的每个项目,总会有来自 dict_A 的匹配项,所以我认为我需要浏览整个字典。但是,反过来不一定正确 - dict_A 中的某些项目可能在 dict_B 中不匹配。
猜你喜欢
  • 2015-07-30
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2012-06-10
  • 2019-10-30
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
相关资源
最近更新 更多