首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python 3中遍历单个字节

在Python 3中遍历单个字节
EN

Stack Overflow用户
提问于 2013-01-11 05:20:02
回答 6查看 54K关注 0票数 58

在Python3中迭代bytes对象时,会将单个bytes作为ints

代码语言:javascript
复制
>>> [b for b in b'123']
[49, 50, 51]

如何获取长度为1的bytes对象?

以下是可能的,但对于读者来说并不是很明显,并且很可能表现不佳:

代码语言:javascript
复制
>>> [bytes([b]) for b in b'123']
[b'1', b'2', b'3']
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-01-11 05:53:00

如果您担心这段代码的性能,并且字节形式的int在您的情况下不适合接口,那么您可能应该重新考虑您使用的数据结构,例如,使用str对象。

您可以对bytes对象进行切片,以获得长度为1的bytes对象:

代码语言:javascript
复制
L = [bytes_obj[i:i+1] for i in range(len(bytes_obj))]

有一个PEP 0467 -- Minor API improvements for binary sequences提出了bytes.iterbytes()方法:

代码语言:javascript
复制
>>> list(b'123'.iterbytes())
[b'1', b'2', b'3']
票数 45
EN

Stack Overflow用户

发布于 2019-08-20 22:20:38

我认为比较不同方法的运行时可能会很有用,所以我做了一个基准测试(使用我的库simple_benchmark):

也许并不令人意外的是,NumPy解决方案是目前为止处理大字节对象最快的解决方案。

但是,如果需要一个结果列表,那么(使用tolist()的) NumPy解决方案和struct解决方案都比其他替代方案快得多。

我没有包括guettlis答案,因为它几乎与jfs解决方案相同,只是使用了生成器函数而不是理解。

代码语言:javascript
复制
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()
票数 12
EN

Stack Overflow用户

发布于 2019-08-20 03:28:35

从Python3.5开始,您可以使用% formatting to bytes and bytearray

代码语言:javascript
复制
[b'%c' % i for i in b'123']

输出:

代码语言:javascript
复制
[b'1', b'2', b'3']

上面的解决方案比你最初的方法快2-3倍,如果你想要一个更快的解决方案,我建议使用numpy.frombuffer

代码语言:javascript
复制
import numpy as np
np.frombuffer(b'123', dtype='S1')

输出:

代码语言:javascript
复制
array([b'1', b'2', b'3'], 
      dtype='|S1')

第二个解决方案比struct.unpack快大约10%(我使用了与@snakecharmerb相同的性能测试,针对100个随机字节)

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14267452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档