【问题标题】:Finding all the unique substrings of a long Python string- performance查找长 Python 字符串的所有唯一子字符串 - 性能
【发布时间】:2019-03-11 11:21:37
【问题描述】:

我以为我手头有一个非常简单的问题——找到给定字符串的所有子字符串。

我是这样做的:

unique_substrings = list(set([p[i:j+1+i] for i in range(len(p)) for j in range(len(p))]))

但是性能很差。在一个随机生成的长度为 900 的字符串上,我需要 1.5 秒。然后我对每个子字符串进行基于长度的数学运算,这进一步花费了更多时间,增加了 3-4 秒。

如何在时间方面提高性能?

已经有类似的答案here,但它与记忆有关。内存不是我的瓶颈。

【问题讨论】:

  • 无论您做什么,如果您考虑所有子字符串,您将花费 O(n²) 的时间和内存。也许,根据您的用例,您可以通过生成从最短到最长的所有子字符串来改进周围的程序(需要所有子字符串的程序)。在这里,我假设您可能希望在找到与其他内容匹配的内容时中止生成,因此不再需要生成更长的内容。这也可能会大大减少您的内存占用。也许你想分享你需要这个做什么,这样我们也可以解决这个问题。
  • 总是使用大量内存也是时间性能问题,因为需要分配这些内存。

标签: python arrays string


【解决方案1】:

如果您考虑当前的起点和点在哪里,则可以将循环迭代次数减半。目前i + j经常超过字符串的长度。

改为尝试:

substrings = {p[i:j] for i in range(len(p)) for j in range(i + 1, len(p) + 1)}

在这里,我们更改语义以使 i 成为起点,j 成为终点,强制执行 j > i

这将包含空字符串""。如果合适,请添加 substrings.add("")

【讨论】:

  • 集合推导 {...} 比包装列表推导 set([...]) 稍快。它也更短。
  • 我不知道这是否重要,但可能需要注意另一个行为差异:OP 的版本包含空字符串,而这没有。
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2014-02-02
  • 2013-07-01
相关资源
最近更新 更多