[英]Time Complexity with Strings in Python
这可能以前问过。 但是我无法通过搜索找到答案,因为我可能只是在搜索错误的东西。
我有两个相似的功能,只有一个细微的区别。 从两者的计时来看,一个明显比另一个快。
下面的函数接受一个单词列表,并连接每个单词。 您会注意到有一行temp = concat
不需要在那里。
def concat_with_add(word_list):
concat = ''
for word in word_list:
concat += word
temp = concat
return concat
这个函数和上面一样,只是没有去掉temp = concat
。 此功能明显更快。
def concat_with_add(word_list):
concat = ''
for word in word_list:
concat += word
return concat
我阅读了对此的解释,但很难理解为什么将concat
变量分配给temp
变量会如此显着地减慢速度。 有没有人能够以我理解的方式解释这一点?
编辑:这就是我计时的方式-
import time
start = time.time()
concat_with_add(random_strings)
end = time.time()
time_add = end - start
print(time_add)
单词列表长度为 100,000
temp = concat
花费的时间是: 4.5
没有它的时间是: 0.02
在语义上, concat += word
创建一个包含concat
和word
串联的新字符串,然后重新分配concat
以引用该新字符串。 这将使您的循环的运行时间成为二次方,因为创建这个新字符串所需的时间与concat
和word
的长度呈线性关系。
然而,在实际实现中,CPython 优化它以改变concat
的内容,而不是创建一个新的字符串,当且仅当concat
是对字符串的唯一引用。 就地附加到字符串所花费的时间仅与word
的长度(摊销)成线性关系。 这使循环的运行时间呈线性。 但是,正如我所说,只有在concat
是对字符串的唯一引用时才能应用这种优化(否则其他变量的值也会改变,这会破坏语义)。 因此,使用temp = concat
引入对字符串的另一个引用会阻止优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.