2016-10-12 24 views
3

刚刚看到(并享受)Brandon Rhodes在PyCon 2015上谈论有关bytearrays的视频。为什么bytearray_obj.extend(字节)与bytearray_obj + = bytes不同?

他说.extend方法很慢,但+=操作的实现方式不同,效率更高。是的,确实如下:

>>> timeit.timeit(setup='ba=bytearray()', stmt='ba.extend(b"xyz123")', number=1000000) 
0.19515220914036036 
>>> timeit.timeit(setup='ba=bytearray()', stmt='ba += b"xyz123"', number=1000000) 
0.09053478296846151 

有两种扩展字节数组的方式是什么原因?他们是否执行完全相同的任务?如果不是,有什么区别?哪一个应该在什么时候使用?

+0

除其他外,因为不能分配给函数调用,所以不能链接'+ ='类似函数调用。对于'+ ='有一个可变的局部性要求,但对'.extend()'没有要求。但'+ ='稍快。 – Roope

+0

@Roope什么是可变局部性要求? – VPfB

+0

'+ ='不能用于[非本地变量](https://www.dotnetperls.com/nonlocal-python)。 – Roope

回答

0

有两种扩展字节数组的方式是什么原因?

  • 运算符不像函数调用那样可链接,而方法是。
  • +=运算符不能与非本地变量一起使用。
  • +=稍快
  • .extend()可能/可能/可能有时可能更具可读性

他们是否执行完全一样的任务是什么?

取决于你如何看待它。实施情况并不相同,但结果通常是这样。对于一堆例子和解释,也许尝试SO搜索,并且例如这个问题:Concatenating two lists - difference between '+=' and extend()

哪一个应该在什么时候使用?

如果您关心性能差异较小的情况,请尽可能使用操作员。除此之外,只要使用你喜欢看的任何一个,当然还有上面提到的限制。

但主要问题是为什么+ =和.extend不能共享相同的内部函数来完成扩展字节数组的实际工作。

因为其中一个速度更快但有局限性,所以我们需要另一个来解决我们遇到的限制。


奖金

递增运算符可能会造成一些有趣的业务,元组:

如果你把一个表中的元组,并使用+ =运算符扩展列表,增量成功,你得到一个类型错误

来源:https://emptysqua.re/blog/python-increment-is-weird-part-ii/

相关问题