Menggabungkan dua byte array python

Jadi apa cara tercepat untuk menggabungkan byte dengan Python? . Skenario yang saya uji adalah rangkaian iteratif blok 1024 byte hingga kami mendapatkan 1MB data. Ini sangat mirip dengan apa yang mungkin dilakukan saat membaca file besar ke memori, jadi tes ini cukup realistis

Implementasi pertama adalah yang naif

def f():
    ret = b''
    for i in range(2**10):
        ret += b'a' * 2**10
    return ret

Diketahui bahwa implementasi naif sangat lambat, karena bytes dalam Python adalah tipe yang tidak dapat diubah, oleh karena itu kita perlu mengalokasikan kembali bytes dan menyalinnya setelah setiap penggabungan. Seberapa lambat itu? . Pola append-and-join adalah cara yang populer (dan efisien) untuk menggabungkan string dalam versi Python lama

def g():
    ret = list()
    for i in range(2**10):
        ret.append(b'a' * 2**10)
    return b''.join(ret)
_

Itu bergantung pada fakta bahwa menambahkan ke daftar itu efisien dan kemudian ''.join dapat mengalokasikan seluruh memori yang diperlukan dan melakukan penyalinan secara efisien. Seperti yang Anda lihat di bawah ini jauh lebih efisien daripada implementasi naif

Piton 2. 6 memperkenalkan bytearray_ sebagai urutan byte yang dapat diubah secara efisien. Menjadi bisa berubah memungkinkan seseorang untuk "secara naif" menggabungkan bytearray dan mencapai kinerja hebat lebih dari 30% lebih cepat daripada pola gabungan di atas

def h():
    ret = bytearray()
    for i in range(2**10):
        ret += b'a' * 2**10
Membandingkan implementasi naif, join, dan bytearray. Waktu untuk 64 iterasi. Membandingkan implementasi join, bytearray, preallocated bytearray, dan memoryview. Waktu untuk 8196 iterasi.

Bagaimana dengan peralokasi memori?

def j():
    ret = bytearray(2**20)
    for i in range(2**10):
        ret[i*2**10:(i+1)*2**10] = b'a' * 2**10
    return ret

Meskipun ini terdengar seperti ide yang bagus, semantik penyalinan Python ternyata sangat lambat. Ini menghasilkan waktu lari 5 kali lebih lambat. Python juga menawarkan

objek memoryview memungkinkan kode Python untuk mengakses data internal objek yang mendukung protokol buffer tanpa menyalin

Ide akses ke data internal tanpa penyalinan yang tidak perlu terdengar bagus

def k():
    ret = memoryview(bytearray(2**20))
    for i in range(2**10):
        ret[i*2**10:(i+1)*2**10] = b'a' * 2**10
    return ret
_

Dan itu berjalan hampir dua kali lebih cepat dari implementasi bytearray yang dialokasikan sebelumnya, tetapi masih sekitar 2. 5 kali lebih lambat dari implementasi sederhana bytearray

Saya menjalankan tolok ukur menggunakan modul

def g():
    ret = list()
    for i in range(2**10):
        ret.append(b'a' * 2**10)
    return b''.join(ret)
_4, mengambil yang terbaik dari lima untuk masing-masing. CPU adalah Intel i7-8550U

________6. Kesimpulan

Implementasi bytearray_ yang sederhana adalah metode tercepat, dan juga sesederhana implementasi yang naif. Prealokasi juga tidak membantu, karena python sepertinya python tidak dapat menyalin secara efisien

bytearray() metode mengembalikan objek bytearray yang merupakan array dari byte yang diberikan

Contoh

prime_numbers = [2, 3, 5, 7]

# convert list to bytearray byte_array = bytearray(prime_numbers)

print(byte_array) # Output: bytearray(b'\x02\x03\x05\x07')


sintaks bytearray()

Sintaks metode bytearray() adalah

bytearray([source[, encoding[, errors]]])
_

bytearray() metode mengembalikan objek bytearray (mis. e. array byte) yang bisa berubah (dapat dimodifikasi) urutan bilangan bulat dalam rentang

bytearray([source[, encoding[, errors]]])
1

Jika Anda menginginkan versi yang tidak dapat diubah, gunakan metode bytes()


bytearray() Parameter

bytearray() membutuhkan tiga parameter opsional

  • sumber (Opsional) - sumber untuk menginisialisasi array byte
  • encoding (Opsional) - jika sumbernya adalah string, pengkodean string
  • kesalahan (Opsional) - jika sumbernya adalah string, tindakan yang harus diambil saat konversi penyandian gagal (Baca lebih lanjut. Pengkodean string)

Parameter sumber dapat digunakan untuk menginisialisasi array byte dengan cara berikut

TypeDescriptionStringMengonversi string menjadi byte menggunakan

bytearray([source[, encoding[, errors]]])
3 Juga harus menyediakan penyandian dan secara opsional errorsIntegerMembuat array dengan ukuran yang disediakan, semua diinisialisasi ke nullObjectBuffer hanya-baca dari objek akan digunakan untuk menginisialisasi byte arrayIterableMembuat array dengan ukuran yang sama dengan jumlah iterable dan diinisialisasi

Bagaimana Anda menggabungkan dua byte dengan Python?

Untuk menggabungkan daftar Byte, panggil Byte. gabung(daftar) metode . Jika Anda mencoba menggabungkan daftar Byte pada pembatas string, Python akan melempar TypeError , jadi pastikan untuk memanggilnya pada objek Byte b' '. Ikuti(. )

Bagaimana Anda menggabungkan array byte?

Untuk menggabungkan beberapa array byte, Anda dapat menggunakan Bytes. concat() metode , yang dapat mengambil sejumlah array.

Bisakah Anda menggabungkan byte?

Metode concat() dari Kelas Bytes di pustaka Guava digunakan untuk menggabungkan nilai dari banyak larik menjadi satu larik . Array byte yang akan digabungkan ini ditentukan sebagai parameter untuk metode ini.

Bagaimana Anda membagi array byte dengan Python?

Solusi. Untuk membagi string byte menjadi daftar baris—setiap baris menjadi string byte itu sendiri— gunakan Bytes. metode split(delimiter) dan gunakan karakter baris baru Bytes b'\n' sebagai pembatas .