2016-03-08 22 views
5

Hat von dem wandelbaren bytearray Typ des nicht-veränderbaren bytes Typen Umwandlung eine Kopie entstehen? Sind damit irgendwelche Kosten verbunden, oder behandelt der Interpreter sie einfach als eine unveränderliche Byte-Sequenz, wie das Umwandeln einer char* in eine const char* const in C++?Wird beim Konvertieren von Bytearray in Byte eine Kopie erstellt?

ba = bytearray() 
ba.extend("some big long string".encode('utf-8')) 

# Is this conversion free or expensive? 
write_bytes(bytes(ba)) 

unterscheidet sich diese zwischen Python 3, wo bytes seine eigene Art und Python ist 2.7, wo bytes nur ein Alias ​​für str ist?

+0

Alle Operationen beinhalten * einige * Kosten. Sie können sich die Quelle ansehen, oder Sie können Zeittests verwenden, um zu sehen, ob die Zeit linear mit der Problemgröße ansteigt (was passieren würde, wenn eine Kopie erstellt würde). –

+0

Ich bin mir ziemlich sicher, dass das Konvertieren von 'bytearray' in' bytes' eine Kopie verursacht. Dies liegt daran, dass, wenn die neuen "Bytes" auf das gleiche Hintergrundarray wie das "Bytearray" zeigen, dies nicht wirklich unveränderbar wäre. – Nayuki

+1

Beachten Sie, dass Sie, wenn Sie eine Ansicht auf den Inhalt eines 'Bytearray' wollen, ohne eine Kopie zu erstellen, _can_ zu diesem Zweck einen' memoryview' verwenden können. Der Nachteil ist, dass Änderungen an den Bytearray-Daten die Daten in der Speicheransicht ändern und dass das Bytearray nicht geändert werden kann (keine Anhängen, Pops, Ändern der Slice-Zuweisung usw.) Solange exportierte Puffer (von denen "memoryview" der häufigste in Python-Level-Code erstellte Typ ist) vorhanden sind. – ShadowRanger

Antwort

11

Eine neue Kopie erstellt wird, wird der Puffer zwischen dem bytesarray und dem neuen bytes Objekt nicht mit anderen geteilt, entweder in Python 2 oder 3.

Sie konnte es nicht teilen, da die bytesarray Objekt noch referenziert werden könnte anderswo und mutieren den Wert.

Für Details, siehe bytesobject.c source code, wo die buffer protocol verwendet wird, um eine gerade Kopie der Daten zu erstellen (über PyBuffer_ToContiguous()).

7

Martjin ist richtig. Ich wollte diese Antwort nur mit der cpython-Quelle beantworten.

an der Quelle der Suche nach here Bytes, ersten bytes_new aufgerufen, die PyBytes_FromObject nennen, welche _PyBytes_FromBuffer nennen werden, die eine neue Bytes erzeugt Objekt und ruft PyBuffer_ToContiguous (definiert here). Dies ruft buffer_to_contiguous auf, was eine Speicherkopiefunktion ist. Der Kommentar für die Funktion lautet:

Kopiere src zu einer zusammenhängenden Darstellung. Ordnung ist eine von "C", "F" (Fortran) oder "A" (Any). Annahmen: src hat PyBUF_FULL-Informationen, src> ndim> = 1, len (mem) == src> len.

So ein Aufruf an Bytes mit einem bytearray Argument werden die Daten kopieren.

Verwandte Themen