繁体   English   中英

Python 中字符串的时间复杂度

[英]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创建一个包含concatword串联的新字符串,然后重新分配concat以引用该新字符串。 这将使您的循环的运行时间成为二次方,因为创建这个新字符串所需的时间与concatword的长度呈线性关系。

然而,在实际实现中,CPython 优化它以改变concat的内容,而不是创建一个新的字符串,当且仅当concat是对字符串的唯一引用。 就地附加到字符串所花费的时间仅与word的长度(摊销)成线性关系。 这使循环的运行时间呈线性。 但是,正如我所说,只有在concat是对字符串的唯一引用时才能应用这种优化(否则其他变量的值也会改变,这会破坏语义)。 因此,使用temp = concat引入对字符串的另一个引用会阻止优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM