![](/img/trans.png)
[英]What is the difference in time complexity between these two blocks of code (if any) and why?
[英]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 + b
和a = b + a
連接的速度,但對於更一般的情況,可以做的並不多,即使是簡單的情況,我也只是提到當字符串長度大於 1000 左右時,它比使用.join
慢得多。
但是,這些操作的確切速度取決於您使用的 Python 版本。 當然,為了公平地比較+
與.join
我們不需要為它們執行相同的操作計時,而您的算法不會這樣做。
正如 Stefan 在評論中指出的那樣,對於您的算法.join
實際上可能更慢,即使對於大字符串也是如此。 底線是:編碼時要注意通用的 Python 習語,但通用規則不能替代測量。 因此,對在典型數據上運行的實際代碼進行速度測試,並在您的軟件 + 硬件上運行。 如果可行,請使用最新版本的 Python。 (OTOH,某些字符串操作在 Python 2 上實際上可以更快,因為它們是使用 ASCII/Latin1 字節字符串而不是完整的 Unicode 字符串完成的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.