2016-05-16 81 views
0

Python PEP 3137介紹bytearray作爲一個可變的8位數組類型。然而,不可變的bytes類型的list實現相同的目標,並且實際上具有betterperformance,雖然也許是更笨拙的語法。這種新類型與Zen of Python`bytearray`是否與Python的Zen不矛盾?

應該有一個 - 最好只有一個 - 明顯的方法來做到這一點。

所以我的問題是:是否有任何記錄主要優勢和設計考慮使用bytes一個bytearraylist

到目前爲止,我還沒有發現在PEP或文檔頁面中記錄的一個動機。事實上,該文檔將它們視爲接近等於:

的ByteArray類型是整數的範圍爲0 < = X < 256.一個可變的序列,具有大部分可變序列的常規方法...

然後,

列表和ByteArray對象支持額外的操作,使對象的就地修改。其他可變序列類型(添加到語言中時)也應該支持這些操作。

由於bytearray s的靜態類型(如8位無符號整數),人們可能預期的性能提升,但逆上面提到的可能是真實的。此外,bytearraybyteslist應該沒有記憶優勢。我可以想象,需要一個itertools.chain風格的可變類型,但這在任何地方都沒有提及,似乎並不是設計目標。

+0

一個bytearray可以做一個列表不能做的事 –

+1

如果你關心性能,你應該使用NumPy。 – kindall

+0

另外,我覺得這個可疑:「另外,字節列表上的字節陣列應該沒有內存優勢。」一個'list'將包含一個引用(4或8個字節,取決於平臺)到每個'bytes'值,該值存儲在別處。一個'bytearray'將會每個值恰好使用1個字節。這應該是一個重大的內存節省。 – kindall

回答

0

首先,一個list類型的容器可以無縫遍歷它們(實際上itertools.chain提供的東西)的對象序列絕對看起來很方便。由於PEP 3137提到,array module可能爲此目的服務,但「遠非理想」。

作者希望「既是可變的也是不可變的字節類型」,這可能意味着設計目標對於可變(可能使用非連續內存用於快速插入和刪除)具有相同的接口,如以及不可變的(絕對連續的內存)實現。就我可以理解,這產生了一系列序列類型,包括array.array,bytes,bytearray,str,unicode, list,tuplegenerator。實質上,它們提供了靜態類型或鴨式類型的接口,可變或不可變序列存儲在內存中或即時評估(生成器)。其中大部分都遵循Abstract Base Classes的理論基礎,但我認爲在可以認爲Pythonic之前還有更多的設計需要完成。

注意:我將此答案打開進行編輯,希望人們可以提供見解或更正。