Czy konwersja z modyfikowalnego typu bytearray
na niezmienny typ bytes
powoduje pobranie kopii? Czy jest z tym związany jakiś koszt, czy też interpreter traktuje go po prostu jako niezmienną sekwencję bajtów, np. Odlewanie char*
do const char* const
w C++?Czy konwersja z bytearray na bajty powoduje pobranie kopii?
ba = bytearray()
ba.extend("some big long string".encode('utf-8'))
# Is this conversion free or expensive?
write_bytes(bytes(ba))
to się różni między Python 3, gdzie bytes
jest jego własny rodzaj i Python 2.7, gdzie bytes
tylko aliasem str
?
Wszystkie operacje wiążą się z * pewnym * kosztem. Możesz przyjrzeć się źródłu lub użyć testów czasowych, aby sprawdzić, czy czas rośnie liniowo wraz z rozmiarem problemu (jak miało to miejsce, gdyby została wykonana kopia). –
Jestem dość pewny, że konwersja 'bytearray' na' bytes' powoduje skopiowanie. Dzieje się tak dlatego, że jeśli nowe 'bytes' wskazuje na tę samą tablicę backingową co' bytearray', to nie byłoby naprawdę niezmienne. – Nayuki
Należy zauważyć, że jeśli chcesz wyświetlić zawartość 'bytearray' bez tworzenia kopii, możesz _ użyć_ widoku' pamięci do tego celu. Ograniczeniem jest to, że zmiany w danych 'bytearray' zmieniają dane w' widoku pamięci' oraz że 'bytearray' nie może być zmieniany (brak" dodania "," pop ", zmiana rozmiaru przypisania plastra, itp.) Dla tak długo, jak długo istnieją eksportowane bufory (z których "widok pamięci" jest najpowszechniejszym typem utworzonym w kodzie poziomu Pythona). – ShadowRanger