2016-10-12 44 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/

相關問題