我正在尝试生成给定字符串中所有重叠n长度子串的列表。
例如,对于6
的n和字符串"hereismystring"
,我会生成列表["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帮助吗?
作为参考,这项技术在我的机器上需要大约100us(一个新的Macbook Pro),长度为500字符串,n为30。
提前感谢您的帮助!
答案 0 :(得分:2)
从Python编码技术最快的问题退一步,我会以不同的方式解决问题。由于所有字符串都是相同的长度,并且都来自单个源字符串,为什么不直接使用字符范围,而不是将它们转换为正确的字符串?您可以避免大量的分配和复制,但是您必须调整代码才能知道每个“字符串”的长度为n个字符。
换句话说,当您想使用子字符串时,只需直接从源字符串中读取范围。您将尽可能快地使用所需的字符从缓存中提取。您可以将“子字符串”表示为源字符串中的偏移量。
有时,如果你想要超快的性能,你必须留下熟悉的数据结构。只是一个想法。
答案 1 :(得分:1)
怎么样:
>>> 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),而列表是O(n)