簡體   English   中英

這兩個python代碼之間的時間復雜度差異是多少?

[英]What is the time complexity difference between this two python code?

我想在 python 中做一個字符串賦值。 但是,在 python 中,'str' 對象不支持項目分配。 如果我想做這個作業, s[head] = s[tail] ,我想出兩個想法:
1.
s[:head]+s[tail]+s[(head+1):tail]+s[head]+s[(tail+1):]
2.

temp = list(s)
temp[head] = temp[tail]
s = ''.join(temp)

我的問題是這兩者之間的時間復雜度是多少? 當我嘗試一些大型示例時,我發現第二個解決方案比第一個解決方案更快,但我不知道為什么。 有人可以為我解釋一下嗎?

當您使用+連接 2 個字符串時,必須分配一個新的字符串對象,並且必須將 2 個源字符串復制到其中。

因此,在您的第一個選項中,您將通過切片創建 5 個新字符串,然后在連接操作期間創建另外 4 個字符串。 總共有 9 個字符串分配和復制操作,然后需要取消分配 8 個中間字符串。

在您的第二個選項中,您從字符串創建一個列表,修改列表項之一,然后加入結果列表。 str.join方法比一對一連接更有效,因為它分兩個階段進行。 在第一階段,它掃描列表中的字符串以確定目標字符串所需的總長度,分配該字符串,然后在第二階段再次掃描列表以復制字符串數據。 (FWIW,這使得將列表理解傳遞給.join比將其傳遞給等效的生成器表達式更有效,因為.join必須將 gen exp 運行到列表中才能執行其 2 次掃描)。

自 Python 2.5 (IIRC) 以來,字符串連接已被優化,以提高a = a + ba = b + a連接的速度,但對於更一般的情況,可以做的並不多,即使是簡單的情況,我也只是提到當字符串長度大於 1000 左右時,它比使用.join慢得多。

但是,這些操作的確切速度取決於您使用的 Python 版本。 當然,為了公平地比較+.join我們不需要為它們執行相同的操作計時,而您的算法會這樣做。

正如 Stefan 在評論中指出的那樣,對於您的算法.join實際上可能更慢,即使對於大字符串也是如此。 底線是:編碼時要注意通用的 Python 習語,但通用規則不能替代測量。 因此,對在典型數據上運行的實際代碼進行速度測試,並在您的軟件 + 硬件上運行。 如果可行,請使用最新版本的 Python。 (OTOH,某些字符串操作在 Python 2 上實際上可以更快,因為它們是使用 ASCII/Latin1 字節字符串而不是完整的 Unicode 字符串完成的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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