不是CPython的str.join()效率不高吗?

时间:2015-04-12 17:09:01

标签: python performance cpython python-internals

This answer及其评论提供了对CPython str.join()的内部工作的一些见解:

  1. 如果参数不是listtuple,则会创建一个包含相同内容的新list
  2. 参数迭代一次,总结它所拥有的字符串的长度。
  3. 为新字符串分配内存。
  4. 最后,该参数将再次迭代,并将字符串复制到新字符串的内存中。
  5. 这对我来说似乎有问题。首先,为什么拒绝所有序列类型,但两个?不只是迭代任何序列两次而不是复制它更快?为什么要制作一个list,特别是如果你不知道你正在制作的迭代的长度?您不需要随机访问,只需重复迭代,并使用list意味着您可能需要在生成期间多次重新分配和复制。使用链接列表或deque

    是否更有意义?

    任何人都可以对这些设计决策提供一些见解吗?

1 个答案:

答案 0 :(得分:2)

  

首先,为什么要拒​​绝所有序列类型而不是两个?不只是迭代任何序列两次而不是复制它会更快吗?

join的论点不一定是序列。它是任何 iterable ,并且一些迭代不能多次迭代。例如,它可以是一个生成器表达式,在迭代一次后会耗尽。

至于你的第二个问题,我不是特别知道,虽然我猜测在内部使用列表和元组简化了C级的实现。我认为对你的问题更广泛的回答是,没有人真的打算对str.join进行一切可能的优化。我猜大多数用例无论如何都会在列表或元组上调用它。