Python中字符串拼接的速度、安全性与兼容性比较

7 投票
3 回答
570 浏览
提问于 2025-04-15 22:28

这里有一些类似的问题被提出来过,关于这个话题的速度比较也很不错。希望这个问题能有所不同,并且更新到Python 2.6和3.0版本。

到目前为止,我觉得在不同的Python版本中,最快且最兼容的方法就是简单的加号+

text = "whatever" + " you " + SAY

不过我听说过很多次,这种方法不安全或者不建议使用。

我甚至不确定有多少种方法可以处理字符串!我能想到的只有大约四种:有插值和它的各种子选项,比如%format,还有简单的方法,比如join+

最后,关于字符串格式化的新方法是使用format,这在向后兼容性上并不好,同时让%在向前兼容性上也不太好。但是,如果我们只使用3.x版本,是否应该在每次字符串操作,包括每次连接时都使用这种方法呢?

嗯,也许这更像是一个维基而不是一个问题,但我确实希望能得到一个关于每种字符串操作方法的正确用法的答案。还有,哪种方法在不同的情况下更适合使用(比如兼容性、速度和安全性)?

谢谢。

编辑:我不确定如果我觉得某个答案并没有真正回答问题,我是否应该接受它……但我的意思是,这三种方法一起能很好地完成工作。

Daniel得到的最高票答案其实是我最想接受的,除了“注释”部分。我非常不同意“连接字符串严格使用+运算符”这句话,因为join也可以进行字符串连接,我们可以为此构建任何任意的库。

目前的三个答案都很有价值,我更希望能有一个答案把它们都结合起来。虽然没有人自愿去做这个,但我想通过选择一个票数较少的答案(但内容比THC4k的更广泛,后者更像是一个很好的评论),我可以引起大家对其他答案的关注。

3 个回答

4

在很多编程语言中,使用 + 来连接字符串会遇到一个问题:每次你要扩展字符串的时候,系统都会把它复制一遍。所以,如果你想把100个小字符串合成一个大字符串,Python在这个过程中会复制99次。

这可花费一些时间:

# join 100 pretty short strings
python -m timeit -s "s = ['pretty short'] * 100" "t = ''.join(s)"
100000 loops, best of 3: 4.18 usec per loop

# same thing, 6 times slower
python -m timeit -s "s = ['pretty short'] * 100" "t = ''" "for x in s:" " t+=x"
10000 loops, best of 3: 30 usec per loop
5

注意: 其实这主要是关于字符串构建的,而不是简单的拼接,因为拼接严格来说就是用 + 操作符把字符串一个接一个地连接起来。

  • +(拼接) - 通常效率不高,但对某些人来说可能更容易理解,只有在可读性优先而性能不重要的情况下使用(比如简单的脚本、一次性脚本或不需要高性能的代码)
  • join(从一系列字符串构建字符串) - 当你有一系列字符串需要用一个共同的字符连接起来时使用这个方法(如果想用空字符串 '' 连接,也可以不使用任何字符)
  • %format(插值) - 基本上其他的操作都应该使用这两者中的一个,选择哪个操作符/函数取决于你希望支持的Python版本(对于2.x版本使用 %,对于3.x版本使用 format
3

使用 + 是可以的,但如果是自动化的就不太合适:

a + small + number + of + strings + "is pretty fast"

不过这样做可能会很慢:

s = ''
for line in anything:
   s += line 

可以试试这个方法:

s = ''.join([line for line in anything])

使用 +'%s%line' 各有优缺点 - 在这里使用 + 会出问题:

s = 'Error - unexpected string' + 42

你是否希望它抛出一个异常,或者默默地做一些不寻常的事情,这取决于你的使用场景。

撰写回答