从Python中的字符串创建重叠子字符串列表的最快方法

2024-09-26 17:47:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图生成一个给定字符串中所有重叠的n长度子字符串的列表。在

例如,对于6和字符串"hereismystring"的n,我将生成列表["hereis", "ereism", "reismy", ..., "string"]。我现在使用的简单代码如下所示:

n = 6
l = len(string)
substrings = [string[i:(i + n)] for i in xrange(l - n + 1)]

很简单。问题是,我想加快速度(我有很多很长的字符串)。Python中有更快的技术吗?既然Python的字符串例程是用C编写的,那么使用Cython会有帮助吗?在

作为参考,这项技术在我的机器(一个新的MacBookPro)上需要大约100个单位,一个500长度的字符串和一个n为30的n。在

提前感谢您的帮助!在


Tags: 字符串代码in列表forstringlen技术
2条回答

从哪个Python编码技术最快的问题上退一步,我将以不同的方式来处理这个问题。既然所有的字符串都是相同的长度,而且都来自一个源字符串,为什么不直接处理字符范围,而不是将它们转换成正确的字符串呢?您可以避免大量的分配和复制,但是您必须调整代码,以知道每个“字符串”都有n个字符长。在

换句话说,当您想使用子字符串时,只需直接从源字符串读取范围。您将以最快的速度处理您想要的角色,因为它们可以从缓存中提取。可以将“substring”表示为源字符串的偏移量。在

有时,如果您想要超快的性能,就必须将熟悉的数据结构抛在脑后。只是一个想法。在

怎么样:

>>> d = deque("hereismystring")
>>> s = ''.join(d)[:6]
>>> while not len(s) % 6:
...    print s
...    _ = d.popleft()
...    s = ''.join(d)[:6]
... 
hereis
ereism
reismy
eismys
ismyst
smystr
mystri
ystrin
string
>>> 

我相信deque是O(1),而list是O(n)

相关问题 更多 >

    热门问题