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 retDiketahui 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
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 retMeskipun 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. KesimpulanImplementasi 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