如何解决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 举报,一经查实,本站将立刻删除。