由于Python的 string
无法更改,我想知道如何更有效地连接字符串?
我可以这样写:
s += stringfromelsewhere
或者像这样:
s = []
s.append(somestring)
later
s = ''.join(s)
在写这个问题的时候,我发现了一篇很好的文章谈论这个话题 .
http://www.skymind.com/~ocrow/python_string/
但它在Python 2.x.中,所以问题是在Python 3中做了哪些改变?
11 回答
使用就地字符串连接是在稳定性和交叉实现方面的最糟糕的连接方法,因为它不支持所有值 . PEP8标准不鼓励这种做法,并鼓励使用format(),join()和append()进行长期使用 .
正如@jdi提到的Python文档建议使用
str.join
或io.StringIO
进行字符串连接 . 并且说开发人员应该在循环中预期来自+=
的二次时间,即使自Python 2.4以来存在优化 . 正如this回答说:我将展示一个天真依赖于此优化的真实代码示例,但它不适用 . 下面的代码将可迭代的短字符串转换为更大的块,以便在批量API中使用 .
由于二次时间复杂度,此代码可以运行数小时 . 以下是建议数据结构的替代方案:
还有一个微基准:
在Python> = 3.6中,新的f-string是连接字符串的有效方法 .
我的用例略有不同 . 我不得不构建一个查询,其中超过20个字段是动态的 . 我遵循这种使用格式方法的方法
这对我来说相对简单,而不是使用或其他方式
虽然有点过时了,Code Like a Pythonista: Idiomatic Python建议
join()
超过+
in this section . 与string concatenation在string concatenation一节中一样,并附有以下免责声明:如果连接的字符串是文字,请使用String literal concatenation
如果要对字符串的一部分进行注释(如上所述),或者如果要对文字的一部分使用raw strings或三引号但不是全部,则此选项非常有用 .
由于这发生在语法层,因此它使用零连接运算符 .
如果你要连接很多值,那么两者都没有 . 附加清单很昂贵 . 您可以使用StringIO . 特别是如果你在很多操作中构建它 .
如果您已经从其他操作返回了完整列表,那么只需使用
''.join(aList)
来自python FAQ:What is the most efficient way to concatenate many strings together?
编辑:我很傻,并将结果粘贴回来,使得看起来像是附加到列表比cStringIO更快 . 我还添加了对bytearray / str concat的测试,以及使用带有更大字符串的更大列表的第二轮测试 . (python 2.7.3)
ipython test example for large lists of strings
你也可以使用它(效率更高) . (https://softwareengineering.stackexchange.com/questions/304445/why-is-s-better-than-for-concatenation)
将字符串附加到字符串变量的最佳方法是使用
+
或+=
. 这是因为它可读且快速 . 它们也同样快,你选择的是品味问题,后者是最常见的 . 以下是timeit
模块的时间安排:但是,建议有列表并附加到这些列表然后加入这些列表的人这样做是因为在扩展字符串时,将字符串附加到列表可能非常快 . 在某些情况下,这可能是真的 . 例如,这里是一个字符串的一百万个附加,首先是一个字符串,然后是一个列表:
好的,事实证明即使结果字符串长达一百万个字符,附加仍然更快 .
现在让我们尝试附加一个千字长串十万次:
因此,结束字符串最终长约100MB . 这很慢,附加到列表要快得多 . 那个时间不包括最后的
a.join()
. 那需要多长时间?Oups . 即使在这种情况下,附加/加入也会变慢 .
那么这个建议来自哪里? Python 2?
好吧,如果你使用的是非常长的字符串(在内存中你通常不是100MB,那么追加/加入的速度会稍微快一点吗?)
但真正的关键是Python 2.3 . 我在哪里赢得了如此之慢以至于尚未完成 . 这些测试突然需要几分钟 . 除了追加/连接之外,它与后来的Pythons一样快 .
对 . 在石器时代,Python中的字符串连接非常慢 . 但是在2.4它已经不再存在(或者至少是Python 2.4.7),所以使用append / join的建议在2008年过时了,当时Python 2.3停止更新,你应该已经停止使用它了 . :-)
(更新:当我更仔细地进行测试时,使用
+
和+=
对于Python 2.3上的两个字符串来说也更快 . 建议使用''.join()
必须是一个误解)但是,这是CPython . 其他实现可能有其他问题 . 这也是为什么过早优化是万恶之源的另一个原因 . 除非你先测量它,否则不要使用“更快”的技术 .
Therefore the "best" version to do string concatenation is to use + or += . 如果这对你来说变得缓慢,这是不太可能的,那么做一些别的事情 .
那么为什么我在代码中使用了很多追加/加入?因为有时它实际上更清晰 . 特别是当你应该连接在一起时,应该用空格或逗号或换行符分隔 .
推荐的方法仍然是使用append和join .
你写这个功能
然后,您可以随时随地拨打电话