【问题标题】:Why is concatenating strings with ''.join(list) so popular? [duplicate]为什么用 ''.join(list) 连接字符串如此受欢迎? [复制]
【发布时间】:2017-10-10 19:06:20
【问题描述】:

我知道''.join(list) 是连接字符串的首选方法,而不是说:

for x in list:
    s += x

我的问题是为什么这么快?

另外,如果我需要连接尚未在列表中的项目怎么办?仅仅为了''.join(list)而将它们放入列表中是否更快?

编辑:这与之前链接的问题不同,因为我特别想知道这些项目是否已经不在列表中,出于性能原因,是否仍建议将它们放在仅出于加入目的的列表。

【问题讨论】:

  • 一般来说,您希望避免使用串联增量构建字符串时会出现的二次行为。构建字符串列表并使用str.join 保证线性行为。尽管 CPython 的最新版本将优化字符串的连接,但这并不能保证。通过将循环向下推到 C 级别,您还可以获得性能改进。

标签: python string python-2.7 list python-3.x


【解决方案1】:

是的,join 更快,因为它不需要不断构建新字符串。

但您不需要列表即可使用 join!你可以给它任何可迭代的,例如generator expression:

''.join(x for x in lst if x != 'toss')

似乎join 在您使用list 时得到了优化。所有这些都是等价的,但是具有列表理解的那个是最快的。

>>> timeit("s=''.join('x' for i in range(200) if i!=47)")
15.870241802178043
>>> timeit("s=''.join(['x' for i in range(200) if i!=47])")
11.294011708363996
>>> timeit("s=''\nfor i in range(200):\n if i!=47:\n  s+='x'")
16.86279364279278

【讨论】:

    【解决方案2】:

    这更快,因为join 方法可以“潜入”“表面”并使用 Python 层不可用的较低级别的优化。循环必须通过序列生成器并依次处理每个对象。此外,您的循环必须在每次迭代时构建一个新字符串,这是一个缓慢的过程。 join 可以在 C 层或更低层上使用可变字符串。

    如果对象不在列表中...这取决于应用程序。但是,我怀疑几乎所有这样的应用程序都必须经过那种循环的开销某处只是为了形成列表,所以你会失去join的一些优势,尽管可变字符串仍然可以节省时间。

    【讨论】:

    • 感谢您对低级优化的评论。
    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 2010-10-20
    • 2012-11-25
    • 2010-12-22
    • 2016-01-20
    • 2019-06-11
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多