Python中字符串连接方法的速度、安全性和兼容性

Python中字符串连接方法的速度、安全性和兼容性,python,string,concatenation,Python,String,Concatenation,同样的问题(速度比较好)。希望这个问题有所不同,并更新为Python2.6和3.0 到目前为止,我相信(在不同的Python版本中)最快、最兼容的方法是简单的+符号: text = "whatever" + " you " + SAY 但我一直在听和读,这是不安全和/或不可取的 我甚至不知道有多少方法可以操作字符串!我只能数到大约4个:有及其所有子选项,如%和格式,还有一些简单的选项,join和+ 最后,带有格式的,肯定不利于向后兼容,同时也使%不利于向前兼容。但是,当我们仅将自己限制为3.x

同样的问题(速度比较好)。希望这个问题有所不同,并更新为Python2.6和3.0

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

text = "whatever" + " you " + SAY
但我一直在听和读,这是不安全和/或不可取的

我甚至不知道有多少方法可以操作字符串!我只能数到大约4个:有及其所有子选项,如
%
格式
,还有一些简单的选项,
join
+

最后,带有
格式的
,肯定不利于向后兼容,同时也使
%
不利于向前兼容。但是,当我们仅将自己限制为3.x时,它是否应该用于每个字符串操作,包括每个串联

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

谢谢

编辑:我不确定我是否应该接受一个答案,如果我觉得它不能真正回答问题。。。但我想说的是,这三个因素加在一起能起到很好的作用

丹尼尔的得票最多的答案实际上是我更愿意接受的答案,如果不是因为“注意”。我非常不同意“连接是严格使用+运算符连接字符串”,因为,首先,
join
也进行字符串连接,我们可以为此构建任意库


目前的3个答案都是有价值的,我希望有一些答案将它们混合在一起。虽然没有人自愿这么做,但我想通过选择投票率较低的一个(但比THC4k的投票范围更广,更像是一个大的、非常受欢迎的评论),我也可以把注意力吸引到其他人身上。

请注意:实际上这都是关于字符串构造的,而不是串联本身,as串联是严格使用
+
运算符将字符串一个接一个地串联在一起

  • +
    (串联)
    -通常效率低下,但对某些人来说更容易阅读,仅在可读性优先而性能不高的情况下使用(简单脚本、一次性脚本、非性能密集型代码)
  • join
    (从字符串序列构建字符串)
    -当需要使用公共字符(或者如果要使用空字符串
    ''
    进行连接,则完全不使用字符)连接字符串序列时,请使用此选项
  • %
    格式
    (插值)
    基本上,每一个其他操作都应该使用其中任何一个合适的,根据您希望在代码生命周期内支持的Python版本选择合适的运算符/函数(对于2.x使用
    %
    ,对于3.x使用
    格式

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

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

您是希望它引发异常,还是以静默方式执行异常操作取决于您的使用。

字符串的
+
问题与许多其他语言中的问题相同:每次扩展字符串时,它都会被复制。因此,为了从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

你在哪里读到
+
是“不安全和/或不可取的”?@John阅读下面的两个答案。他们都不鼓励使用
+
。也许我对“advisible”的理解与你不同。不管怎么说,你是在答案写出来之前写的。另外,这两个答案都没有指出,在最近的蟒蛇中,
+=
的速度更快。你在哪里读到的
+
是“不安全的”?@John,那是因为一般的常识很可能来自其他地方。关于速度,请看第二个链接。最后,“安全”部分更多地来自于听力。这里的一些消息灵通的工作人员告诉我,这是一个,更容易做字符串注入。但我找不到这方面的更多信息。无论如何,你知道,这不是维基百科;Python2.6和onWell都支持P,我这里的重点是连接,我不想讨论格式化字符串和所有这些。但公平地说,谈到
格式
%
其他函数,最好说“构造”,我甚至没有想到这个词。我不知道,你仍然认为如果我更改标题会更好吗?至于连接速度,请看我提供的用于速度比较的链接。你会感到惊讶的。另外,我不想在这里讨论设计/可读性。我认为在这种情况下这是非常主观的。但是你是说即使对于小字符串,
join
的性能也比
+
好吗?我敢说,几乎每一个软件都会有几乎每一行带有小字符串串接的代码。。。但是人们在谈论这个话题时似乎是相反的方式。
s=''.join([line-for-line in anything])
有一个无意义的循环来构造一个无意义的列表->
s='.join(anything)
@Cawas,对于少量的字符串,没有真正的区别。对于大量(比如100个)小字符串(当最终结果是大字符串时),join速度更快。两者都应该非常快。可读性更重要。@THC4k,如果
任何东西
都是迭代器,这并不是毫无意义的<代码>''。join需要列表,而不是