我有一个列表/数组,我想保存到二进制文件。 关键部分是,不应将每个数字保存为预定义的数据类型。 每个值的位对于列表中的所有值都是常量,但不对应于典型的数据类型(例如byte或int)。
import numpy as np
# create 10 random numbers in range 0-63
values = np.int32(np.round(np.random.random(10)*63));
# each value requires exactly 6 bits
# how to save this to a file?
# just for debug/information: bit string representation
bitstring = "".join(map(lambda x: str(bin(x)[2:]).zfill(6), values));
print(bitstring)
在实际项目中,我想用给定的位dephts存储超过一百万个值。 我已经尝试过模块bitstring,但是将每个值附加到BitArray会花费很多时间......
答案 0 :(得分:1)
可能是一些numpy
特定的方式,使事情变得更容易,但这是一种纯Python(2.x)方式。它首先将值列表转换为单个整数,因为Python支持任意长度的int
值。接下来,它将int
值转换为字节字符串并将其写入文件。
注意:如果您确定所有值都符合指定的位宽,那么array_to_int()
函数可以通过将其使用的(value & mask)
更改为{{1}来略微加快}。
value
答案 1 :(得分:0)
由于您给出了一个字符串示例,我将假设您获得结果的方式。这意味着性能可能永远不会很好。如果可以,请尝试直接创建字节而不是通过字符串。
旁注:我正在使用Python 3,可能需要您对Python 2进行一些更改。我认为此代码应该直接在Python 2中工作,但是在字节数组和2到3之间的字符串,所以一定要检查。
byt = bytearray(len(bitstring)//8 + 1)
for i, b in enumerate(bitstring):
byt[i//8] += (b=='1') << i%8
并获得回报:
bitret = ''
for b in byt:
for i in range(8):
bitret += str((b >> i) & 1)
对于数百万比特/字节,您需要将其转换为流式传输方法,否则您将需要大量内存。