查找长Python字符串的所有唯一子字符串-性能

查找长Python字符串的所有唯一子字符串-性能,python,arrays,string,Python,Arrays,String,我想我手头有一个非常简单的问题——找到给定字符串的所有子字符串 我是这样做的: unique_substring=list(设置[p[i:j+1+i]表示范围内的i(len(p))表示范围内的j(len(p))) 但是性能很差。在随机生成的长度为900的字符串上,需要1.5秒。然后,我对每个子字符串进行基于长度的数学运算,这会进一步花费更多的时间,增加3-4秒 如何在时间方面提高绩效 已经有一个类似的答案,但它与记忆有关。内存不是我的瓶颈。如果考虑到当前的起点和点,可以将循环迭代次数减半。此时,

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

我是这样做的:

unique_substring=list(设置[p[i:j+1+i]表示范围内的i(len(p))表示范围内的j(len(p)))

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

如何在时间方面提高绩效


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

如果考虑到当前的起点和点,可以将循环迭代次数减半。此时,
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


这将不包括空字符串
。使用
子字符串添加它。如果合适,添加(“”

如果考虑到当前的起点和点,可以将循环迭代次数减半。此时,
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


这将不包括空字符串
。用
子字符串添加它。如果合适,添加(“”

集合理解
{…}
比包装列表理解
集合([…])稍微快一些。
。它也比较短。我不知道这是否重要,但在行为上还有另一个需要注意的区别:OP的版本包含空字符串,而不是空字符串。集合理解
{…}
比包装列表理解
集合([…])
稍微快一点。它也比较短。我不知道它是否重要,但是行为的另一个差异可能需要注意:OP的版本包括空字符串,这不。无论你做什么,如果你考虑所有子串,你将有时间和内存的O(n)的努力。也许,根据您的用例,您可以通过从最短到最长生成所有子字符串来改进您周围的程序(需要所有子字符串的程序)。在这里,我假设您可能希望在发现与其他内容匹配的内容时中止生成,因此不再需要生成较长的内容。这也可能大大减少内存占用。也许你想分享你所需要的,所以我们也可以做这件事。使用大量的内存总是一个时间性能问题,因为这个内存需要被分配。无论你做什么,如果你考虑所有子串,你将有时间和内存的O(n)胡力。也许,根据您的用例,您可以通过从最短到最长生成所有子字符串来改进您周围的程序(需要所有子字符串的程序)。在这里,我假设您可能希望在发现与其他内容匹配的内容时中止生成,因此不再需要生成较长的内容。这也可能大大减少内存占用。也许你想分享一下你需要它做什么,这样我们也可以处理这个问题。使用大量内存也是一个时间性能问题,因为需要分配内存。