2016-05-16 12 views
0

Python PEP 3137 eingeführt bytearray als ein veränderbarer 8-Bit-Array-Typ. Ein list des unveränderlichen Typs bytes erfüllt jedoch das gleiche Ziel und hat tatsächlich betterperformance, wenn auch vielleicht eine klügere Syntax. Dieser neue Typ widerspricht der Zen of PythonWiderspricht 'Bytearray' nicht dem Zen von Python?

Es sollte eine - und vorzugsweise nur eine - offensichtliche Möglichkeit geben, dies zu tun.

Also meine Frage ist: Gibt es eine dokumentierte große Vorteil oder Designbetrachtung für eine bytearray über einen list von bytes mit?

Bisher habe ich keine Motivation in der PEP oder in den Dokumentationsseiten dokumentiert gefunden. In der Tat, behandelt die Dokumentation, sie als nahezu gleich:

Der bytearray Typ ist ein veränderliches Folge von ganzen Zahlen im Bereich von 0 < = x < 256. meisten der üblichen Methoden der wandelbaren Sequenzen hat ...

und dann

Liste und bytearray Objekte unterstützen zusätzliche Operationen, die an Ort und Stelle Modifikation des Objekts ermöglichen. Andere änderbare Sequenztypen (wenn sie der Sprache hinzugefügt werden) sollten diese Operationen ebenfalls unterstützen.

Als bytearray s statisch typisiert werden (als 8-Bit-Integer ohne Vorzeichen) könnte man eine Leistungssteigerung zu erwarten, aber wie oben erwähnt der inversen ist wohl wahr. Es sollte auch keinen Speichervorteil für eine bytearray über eine list von bytes geben. Ich könnte mir vorstellen, dass ein veränderbarer Typ itertools.chain erforderlich ist, aber dies wird nirgends erwähnt und scheint nicht das Designziel zu sein.

+0

Ein Bytearray kann Dinge tun, die eine Liste nicht kann –

+1

Wenn Sie über die Leistung besorgt sind, sollten Sie wahrscheinlich NumPy verwenden. – kindall

+0

Auch ich finde das zweifelhaft: "Außerdem sollte es keinen Speichervorteil für ein Bytearray über eine Liste von Bytes geben." Eine 'liste' wird eine Referenz (4 oder 8 Bytes, abhängig von der Plattform) zu jedem 'Bytes'-Wert enthalten, der an anderer Stelle gespeichert wird. Ein Bytearray wird genau 1 Byte pro Wert verwenden. Dies sollte zu einer erheblichen Speicherersparnis führen. – kindall

Antwort

0

Zunächst scheint ein list-Container für Sequenzen von Objekten, die nahtlos durch sie durchlaufen können (was itertools.chain tatsächlich bietet), bequem zu sein scheint. Als PEP 3137 erwähnt, könnte die array module für diesen Zweck gedient haben, war aber "weit von ideal".

Die Autoren wünschten "sowohl einen veränderlichen als auch einen unveränderlichen Byte-Typ", was bedeuten könnte, dass das Entwurfsziel die gleiche Schnittstelle für einen veränderlichen (vielleicht nicht zusammenhängenden Speicher für schnelle Einfügungen und Löschungen) hatte als eine unveränderliche (definitiv zusammenhängende Speicher) Implementierung. Diese erstellt, soweit ich erkennen kann, ein Wirrwarr von Sequenztyp, einschließlich array.array, bytes, bytearray, str, unicode, list, tuple und generator. Im Wesentlichen stellen sie Schnittstellen zu statisch getippten oder ducked type, veränderbaren oder unveränderlichen Sequenzen bereit, die im Speicher gespeichert oder während des Betriebs (Generatoren) ausgewertet werden. Die meisten folgen dem Grundprinzip der Abstract Base Classes, aber ich denke, dass es mehr Design zu tun gibt, bevor dies als Pythonic angesehen werden kann.

Hinweis: Ich lasse diese Antwort zum Bearbeiten geöffnet, in der Hoffnung, dass die Leute Einblicke oder Korrekturen beitragen könnten.