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