簡體   English   中英

從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM