假设您有这段代码可以从三个字符串中构建一个字符串:
x = 'foo'x += 'bar' # 'foobar'x += 'baz' # 'foobarbaz'
在这种情况下,Python首先需要分配和创建,
'foobar'然后才能分配和创建
'foobarbaz'。
因此,对于每个
+=被调用的字符串,其全部内容以及所添加的内容都需要复制到一个全新的内存缓冲区中。换句话说,如果您
N要连接字符串,则需要分配大约
N临时字符串,并且第一个子字符串将被复制大约N次。最后一个子字符串仅被复制一次,但是平均而言,每个子字符串被复制
~N/2一次。
使用
.join,Python可以起到许多技巧,因为不需要创建中间字符串。CPython计算出它需要多少内存,然后分配一个正确大小的缓冲区。最后,它将每个片段复制到新缓冲区中,这意味着每个片段仅被复制一次。
+=在某些情况下,还有其他可行的方法可能会导致更好的性能。例如,内部字符串表示形式实际上是a
rope还是运行时足够聪明,以某种方式找出临时字符串对程序没有用,并对其进行优化。
但是,CPython当然 不能
可靠地进行这些优化尽管可能在[某些极端情况下,并且由于它是使用中最常见的实现,因此许多最佳实践都基于对CPython有效的方法。拥有一套标准化的规范也使其他实施更容易集中精力进行优化。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)