![](/img/trans.png)
[英]What is the fastest way to filter a set of substrings from a string in python?
[英]Fastest way to create a list of overlapping substrings from a string in Python
我正在嘗試生成給定字符串中所有重疊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。
我在這里先向您的幫助表示感謝!
從Python編碼技術最快的問題退一步,我會以不同的方式解決問題。 由於所有字符串都是相同的長度,並且都來自單個源字符串,為什么不直接使用字符范圍,而不是將它們轉換為正確的字符串? 您可以避免大量的分配和復制,但是您必須調整代碼才能知道每個“字符串”的長度為n個字符。
換句話說,當您想要使用子字符串時,只需直接從源字符串中讀取范圍。 您將盡可能快地使用所需的字符從緩存中提取。 您可以將“子字符串”表示為源字符串中的偏移量。
有時,如果你想要超快的性能,你必須留下熟悉的數據結構。 只是一個想法。
怎么樣:
>>> 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.