python matplotlib文字 plt - 在Python 3中將字符串轉換為字節的最佳方法是什麼?




3 Answers

如果您查看文檔的bytes ,則會指向bytearray

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

返回一個新的字節數組。 bytearray類型是一個在0 <= x <256範圍內的可變整數序列。它具有可變序列的大多數常用方法,在可變序列類型中描述,以及字節類型具有的大多數方法,請參見字節和字節數組方法。

可選的source參數可以用幾種不同的方式初始化數組:

如果它是一個字符串,則還必須給出編碼(以及可選的錯誤)參數; bytearray()然後使用str.encode()將字符串轉換為字節。

如果它是一個整數,則數組將具有該大小,並將用空字節進行初始化。

如果它是符合緩衝區接口的對象,則將使用該對象的只讀緩衝區來初始化字節數組。

如果它是一個可迭代的,它必須是0 <= x <256範圍內的整數的迭代,它們被用作數組的初始內容。

沒有參數,就會創建一個大小為0的數組。

所以bytes可以做的不僅僅是編碼一個字符串。 Pythonic可以讓你用任何類型的源參數調用構造函數,這是合理的。

為了編碼一個字符串,我認為some_string.encode(encoding)比使用構造函數更Pythonic,因為它是最自我記錄 - “獲取此字符串並用此編碼進行編碼”比bytes(some_string, encoding) - 使用構造函數時沒有明確的動詞。

編輯:我檢查了Python的來源。 如果使用CPython將unicode字符串傳遞給bytes ,則會調用PyUnicode_AsEncodedString ,這是encode的實現; 所以如果你打電話給自己encode你只是跳過了一個間接的層面。

此外,請參閱Serdalis的評論 - unicode_string.encode(encoding)也是更多Pythonic,因為它的反轉是byte_string.decode(encoding)並且對稱性很好。

title location

似乎有兩種不同的方法將字符串轉換為字節,如TypeError的答案中所示:'str'不支持緩衝區接口

哪種方法會更好或者更加Pythonic? 還是僅僅是個人喜好的問題?

b = bytes(mystring, 'utf-8')

b = mystring.encode('utf-8')



絕對最好的方法不是2,而是3。 encode的第一個參數默認為 'utf-8' 。 因此最好的方法是

b = mystring.encode()

這也會更快,因為默認參數不在C代碼中的字符串"utf-8"中,而是NULL ,它的檢查速度快得多!

這裡有一些時機:

In [1]: %timeit -r 10 'abc'.encode('utf-8')
The slowest run took 38.07 times longer than the fastest. 
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 183 ns per loop

In [2]: %timeit -r 10 'abc'.encode()
The slowest run took 27.34 times longer than the fastest. 
This could mean that an intermediate result is being cached.
10000000 loops, best of 10: 137 ns per loop

儘管有警告,但經過反復運行後的時間非常穩定 - 偏差僅為〜2%。




so_string = ''
so_bytes = so_string.encode( )



Related