python join_为什么在Python中’.join()比=快?

让我们假设你有这个代码从三个字符串构建一个字符串:

x = 'foo'

x += 'bar' # 'foobar'

x += 'baz' # 'foobarbaz'

在这种情况下,Python首先需要分配和创建’foobar’,然后才能分配和创建’foobarbaz’。

所以对于每个被调用的,字符串的整个内容和被添加到它的任何内容需要被复制到一个全新的内存缓冲区。换句话说,如果你有N个字符串要被连接,你需要分配大约N个临时字符串,第一个子字符串被复制〜N次。最后一个子字符串只被复制一次,但平均来说,每个子字符串被复制〜N / 2次。

使用.join,Python可以发挥一些技巧,因为中间字符串不需要创建。 CPython计算出它需要多少内存,然后分配一个正确大小的缓冲区。最后,它然后将每个片段复制到新的缓冲器中,这意味着每个片段仅被复制一次。

在某些情况下,还有其他可行的方法可以导致更好的性能。例如。如果内部字符串表示实际上是一个rope或者如果运行时实际上足够聪明,以某种方式弄清楚临时字符串是没有用的程序和优化他们。

然而,CPython当然不能可靠地进行这些优化(虽然它可能适用于few corner cases),并且由于它是最常用的实现,许多最佳实践都是基于对CPython有效的。具有标准化规范集合还使得其他实现方式更容易集中其优化努力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值