微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 将方法应用于来自两个大列表的元素对需要很长时间来处理

如何解决Python 将方法应用于来自两个大列表的元素对需要很长时间来处理

我有两个包含字符串的列表 - 两个列表的大小通常为 100,000 甚至更多。

我也有一个方法,它采用两个字符串并测量它们的相似距离。我尝试过嵌套循环,例如

Results=[]
for i in list_1:
   for j in list_2:
      Results.append( (i,j,edit_distance(i,j)) )

问题在于,由于比较次数较多,此代码需要很长时间来处理。我也尝试过 zip() 方法,但仍然需要很长时间。有没有办法让这个比较更快?

解决方法

循环不是你的问题。为每对字符串调用 edit_distance 几乎消耗了您所有的运行时间,因此您应该首先考虑提高性能。

根据您发布的内容,您可以做出的最佳改进是将循环变成生成器,以降低生成 100,000x100,000 元素列表的成本:

import itertools

def edit_distances(list1,list2):
    for i,j in itertools.product(list1,list2):
        yield (i,j,edit_distance(i,j))
,

正如 Woodford 已经建议的那样,使用生成器可能会做得更好——如果您只需要通过某种迭代访问这些数字一次。如果您需要多次索引或引用它们,或按其他顺序索引或引用它们,那么您将需要完整的表格。

您可能会浪费大量时间来扩大 10^10 个元素的列表,一次一个元素。此外,如果这是一个表现良好的距离函数,那么您知道 f(i,j) == f(j,i),并且 f(i,i) == 0,因此您可以减少计算时间如果避免冗余计算,则略高于一半。

  • 如果i == j,则填0,不调用函数。

  • 记住你的函数:如果 i > j,获取 f(j,i) 的存储值,而不是重新计算。

  • 使用理解来构建列表,而不是 10^10 append 次操作。

    结果 = [0 如果 i == j 否则存储 [(j_str,i_str)] 如果 i > j 否则编辑距离(i_str,j_str) 对于 i,list_1 中的 i_str 对于 j,list_2 中的 j_str ]

这里假设 edit_distance 负责更新内存 stored。您可以在任何有关记忆的教程(以及大多数关于动态编程的参考资料)中找到详细信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。