【问题标题】:Python Converts integer into a bit number of specific length, fastPython将整数转换为特定长度的位数,速度快
【发布时间】:2013-10-24 18:20:33
【问题描述】:

我正在尝试对像素列表进行增量压缩并将它们存储在二进制文件中。我设法做到了这一点,但是我发现的方法每帧大约需要 4 分钟。

def getByte_List(self):
    values = BitArray("")
    for I in range(len(self.delta_values)):
        temp = Bits(int= self.delta_values[I], length=self.num_bits_pixel)
        values.append(temp)
    ##start_time = time.time()
    bit_stream = pack("uint:16, uint:5, bits", self.intial_value, self.num_bits_pixel, values)
    ##end_time = time.time()
    ##print(end_time - start_time)

    # Make sure that the list of bits contains a multiple of 8 values
    if (len(bit_stream) % 8):
        bit_stream.append(Bits(uint=0, length = (8-(len(bit_stream) % 8))))                           #####Append? On a pack? (Only work on bitarray? bit_stream = BitArray("")

    # Create a list of unsigned integer values to represent each byte in the stream
    fmt = (len(bit_stream)/8) * ["uint:8"]
    return bit_stream.unpack(fmt)

这是我的代码。我取初始值、每个像素的位数和增量值并将它们转换为位。然后我进行字节对齐并采用字节的整数表示并在其他地方使用它。问题区域是我将每个增量值转换为位(3 分钟)和打包(1 分钟)的位置。是否可以更快地完成我正在做的事情或以其他方式将它们直接打包成表示字节的整数。

【问题讨论】:

  • 对于这种操作,你肯定希望使用低级语言,或者优秀的numpy。直的python真的不适合这个

标签: python integer bits typeconverter


【解决方案1】:

通过对您正在实例化的类的快速 Google 搜索,您似乎正在使用 bitstring 模块。这是用纯 Python 编写的,所以速度很慢也就不足为奇了。您可能会查看以下一项或多项:

  • struct - Python 附带的一个模块,可让您将 C 结构打包和解包到组成值中
  • bytearray - 一种内置类型,可让您累积字节数组,并且具有类似列表和类似字符串的操作
  • bin(x)int(x, 2) - 将数字转换为作为字符串的二进制表示,然后返回 - 字符串操作有时是一种相当有效的方法
  • bitarray - 用于位操作的本机 (C) 模块,看起来它具有与 bitstring 类似的功能,但应该更快。以适合在 Linux 上编译的形式提供 here 或为 Windows 预编译的 here
  • numpy - 快速操作各种类型的数组,包括单字节。坦率地说,这是这类事情的首选模块。 http://www.numpy.org/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多