繁体   English   中英

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

[英]Python applying a method to elements pairs from two large lists take long time to process

我有两个包含字符串的列表 - 两个列表的大小通常是 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 个元素的列表上,一次一个元素。 此外,如果这是一个行为良好的距离 function,那么您知道 f(i, j) == f(j, i),并且 f(i, i) == 0,因此您可以缩短计算时间如果避免冗余计算,则略多于一半。

  • 如果i == j,填0,不调用function。

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

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

    结果 = [0 if i == j else stored[(j_str, i_str)] if i > j else edit_distance(i_str, j_str) for i, i_str in list_1 for j, j_str in list_2 ]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM