【问题标题】:which is more efficient for buffer manipulations: python strings or array()这对于缓冲区操作更有效:python 字符串或 array()
【发布时间】:2011-01-13 02:09:06
【问题描述】:

我正在构建一个用于取证目的处理磁盘缓冲区的例程。我最好使用 python 字符串还是 array() 类型?我的第一个想法是使用字符串,但我试图避免 unicode 问题,所以也许 array('c') 更好?

【问题讨论】:

  • 用例是什么?您是否只是读取字节并分析它们?在内存中修改?创建副本?
  • 这完全取决于处理涉及的内容。你能给我们一些线索吗?
  • 很多子字符串操作。字节提取。比较。直方图计算。它都是只读的,没有修改。

标签: python arrays performance


【解决方案1】:

如果您需要就地更改缓冲区(不清楚是否这样做,因为您使用了模糊的术语“处理”),arrays 可能会更好,因为strings 是不可变的。然而,在 Python 2.6 或更高版本中,bytearrays 可能是两全其美的——可变的丰富的方法也可用于正则表达式。

对于只读操作,字符串比array 有优势(这要归功于更多的方法,以及它们上可用的正则表达式等额外功能),如果你被旧的 Python 版本卡住而无法使用 @ 987654325@。无论哪种情况,Unicode 都不是问题(在 Python 2 中;在 Python 3 中,肯定选择bytearray!-)。

【讨论】:

    【解决方案2】:

    使用最自然的(字符串)编写代码,找出它是否太慢,然后改进它。

    在大多数情况下,只要您将自己限制为索引和切片访问,数组就可以用作str 的直接替代品。两者都是固定长度。两者应该具有大致相同的内存要求。数组是可变的,以防您需要更改缓冲区。数组可以直接从文件中读取,因此读取时不会影响速度。

    不过,我不明白您如何通过使用数组来避免 Unicode 问题。 str 只是一个字节数组,对字符串的编码一无所知。

    我假设你提到的“磁盘缓冲区”可能相当大,所以你可能会考虑使用mmap

    内存映射文件对象的行为既像字符串,又像文件对象。然而,与普通字符串对象不同的是,它们是可变的。您可以在大多数需要字符串的地方使用 mmap 对象;例如,您可以使用 re 模块搜索内存映射文件。因为它们是可变的,你可以通过 obj[index] = 'a' 来改变单个字符,或者通过分配给切片来改变子字符串:obj[i1:i2] = '...'。您还可以从当前文件位置开始读写数据,并通过文件seek() 到不同位置。

    【讨论】:

      猜你喜欢
      • 2013-03-12
      • 1970-01-01
      • 2014-12-31
      • 2016-01-24
      • 2017-12-05
      • 1970-01-01
      • 2014-10-03
      • 2017-12-29
      • 1970-01-01
      相关资源
      最近更新 更多