【发布时间】:2019-09-28 21:17:31
【问题描述】:
如果只是如下的字符串拼接,则立即结束。
test_str = "abcdefghijklmn123456789"
str1 = ""
str2 = ""
start = time.time()
for i in range(1, 100001):
str1 = str1 + test_str
str2 = str2 + test_str
if i % 20000 == 0:
print("time(sec) => {}".format(time.time() - start))
start = time.time()
恒定的处理时间
time(sec) => 0.013324975967407227
time(sec) => 0.020363807678222656
time(sec) => 0.009979963302612305
time(sec) => 0.01744699478149414
time(sec) => 0.0227658748626709
莫名其妙地,将连接的字符串分配给另一个变量会使过程越来越慢。
test_str = "abcdefghijklmn123456789"
str1 = ""
str2 = ""
start = time.time()
for i in range(1, 100001):
str1 = str1 + test_str
# str2 = str2 + test_str
# ↓
str2 = str1
if i % 20000 == 0:
print("time(sec) => {}".format(time.time() - start))
start = time.time()
处理时间会有所延迟。
time(sec) => 0.36466407775878906
time(sec) => 1.105351209640503
time(sec) => 2.6467738151550293
time(sec) => 5.891657829284668
time(sec) => 9.266698360443115
python2 和 python3 给出相同的结果。
【问题讨论】:
-
因为您使用的是二次时间算法。解释器能够对此进行优化,但仅限于某些情况。你不应该依赖它,而是使用线性时间算法(通常,附加到列表然后
''.join) -
根据@shadowranger的回答进行了验证,找到了原因。如果只使用字符串拼接,str1和str2的id保持不变,但是如果str1赋值给str2,str1的id每次都会改变。换句话说,每次都分配 str1 会减慢它的速度。
-
common sequence operations 文档中的注释 6 明确指出此行为是二次的。
标签: python append big-o string-concatenation