速度与安全性与在Python中进行字符串连接的方法的兼容性

时间:2010-05-07 22:01:31

标签: python string concatenation

Similarhave been brought问题subject(在那里进行了良好的速度比较)interpolation。希望这个问题不同并更新为Python 2.6 3.0

到目前为止,我认为更快,最兼容的方法(在不同的Python版本中)是简单的+符号:

text = "whatever" + " you " + SAY

但我一直听到并且阅读它并不安全和/或可取。

我甚至不确定有多少方法可以操纵字符串!我只能计算大约4:new approach to string formatting及其所有子选项,例如%format,然后是简单的选项,join+

最后,带有format的{​​{3}}肯定不利于向后兼容,同时使%不利于向前兼容性。但是,每当我们将自己限制在3.x时,它是否应该用于每个字符串操作,包括每个连接?

嗯,也许这更像是一个wiki而不是一个问题,但我确实希望得到的答案,这是每个字符串操作方法的正确用法。哪一个可以通常用于每个焦点(最好的兼容性,速度和安全性)。

感谢。

编辑:如果我不觉得它真的回答了这个问题,我不确定我应该接受一个答案......但我的观点是,他们所有人在一起做了一个合适的工作。

丹尼尔投票最多的答案实际上是我更愿意接受的答案,如果不是“笔记”的话。我非常不同意“连接是严格使用+运算符来连接字符串”因为,对于一个,join也会进行字符串连接,我们可以为此构建任意库。 / p>

目前所有3个答案都很有价值,我宁愿将一些答案混合在一起。虽然没有人自愿这样做,但我想通过选择较少的投票(但比THC4k更广泛,这更像是一个大而且非常受欢迎的评论)我也可以引起对其他人的关注。

3 个答案:

答案 0 :(得分:5)

作为备注:实际上这完全是关于字符串构造而不是连接本身,因为连接严格使用+运算符来连接字符串一个接一个地在一起。

  • +(连接) - 通常效率低下但对某些人来说更容易阅读,只有在可读性优先且性能不高时才使用(简单脚本,一次性脚本,非性能密集型代码)
  • join(根据字符串序列构建字符串) - 当您拥有需要使用公共字符(或根本没有字符)加入的字符串序列时使用此选项如果你想使用空字符串''来加入)
  • %format(插值) - 基本上所有其他操作都应该使用其中任何一个是合适的,根据哪个版本选择适合的运算符/函数您希望在代码的生命周期内支持的Python(对于2.x使用%,对于3.x使用format

答案 1 :(得分: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

答案 2 :(得分:3)

使用+是可以的,但如果它是自动的则不行:

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

但这可能会很慢:

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

请改用:

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

使用+ vs '%s%line'有利有弊 - 使用+会失败:

s = 'Error - unexpected string' + 42

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