在Python3中迭代bytes
对象时,会将单个bytes
作为ints
>>> [b for b in b'123']
[49, 50, 51]
如何获取长度为1的bytes
对象?
以下是可能的,但对于读者来说并不是很明显,并且很可能表现不佳:
>>> [bytes([b]) for b in b'123']
[b'1', b'2', b'3']
发布于 2013-01-11 05:53:00
如果您担心这段代码的性能,并且字节形式的int
在您的情况下不适合接口,那么您可能应该重新考虑您使用的数据结构,例如,使用str
对象。
您可以对bytes
对象进行切片,以获得长度为1的bytes
对象:
L = [bytes_obj[i:i+1] for i in range(len(bytes_obj))]
有一个PEP 0467 -- Minor API improvements for binary sequences提出了bytes.iterbytes()
方法:
>>> list(b'123'.iterbytes())
[b'1', b'2', b'3']
发布于 2019-08-20 22:20:38
我认为比较不同方法的运行时可能会很有用,所以我做了一个基准测试(使用我的库simple_benchmark
):
也许并不令人意外的是,NumPy解决方案是目前为止处理大字节对象最快的解决方案。
但是,如果需要一个结果列表,那么(使用tolist()
的) NumPy解决方案和struct
解决方案都比其他替代方案快得多。
我没有包括guettlis答案,因为它几乎与jfs解决方案相同,只是使用了生成器函数而不是理解。
import numpy as np
import struct
import sys
from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()
@b.add_function()
def jfs(bytes_obj):
return [bytes_obj[i:i+1] for i in range(len(bytes_obj))]
@b.add_function()
def snakecharmerb_tobytes(bytes_obj):
return [i.to_bytes(1, sys.byteorder) for i in bytes_obj]
@b.add_function()
def snakecharmerb_struct(bytes_obj):
return struct.unpack(str(len(bytes_obj)) + 'c', bytes_obj)
@b.add_function()
def Leon(bytes_obj):
return list(map(bytes, zip(bytes_obj)))
@b.add_function()
def rusu_ro1_format(bytes_obj):
return [b'%c' % i for i in bytes_obj]
@b.add_function()
def rusu_ro1_numpy(bytes_obj):
return np.frombuffer(bytes_obj, dtype='S1')
@b.add_function()
def rusu_ro1_numpy_tolist(bytes_obj):
return np.frombuffer(bytes_obj, dtype='S1').tolist()
@b.add_function()
def User38(bytes_obj):
return [chr(i).encode() for i in bytes_obj]
@b.add_arguments('byte object length')
def argument_provider():
for exp in range(2, 18):
size = 2**exp
yield size, b'a' * size
r = b.run()
r.plot()
发布于 2019-08-20 03:28:35
从Python3.5开始,您可以使用% formatting to bytes and bytearray
[b'%c' % i for i in b'123']
输出:
[b'1', b'2', b'3']
上面的解决方案比你最初的方法快2-3倍,如果你想要一个更快的解决方案,我建议使用numpy.frombuffer:
import numpy as np
np.frombuffer(b'123', dtype='S1')
输出:
array([b'1', b'2', b'3'],
dtype='|S1')
第二个解决方案比struct.unpack快大约10%(我使用了与@snakecharmerb相同的性能测试,针对100个随机字节)
https://stackoverflow.com/questions/14267452
复制相似问题