在缓冲区操作中,Python 字符串和 array() 哪个更高效?
我正在建立一个程序,用来处理磁盘缓存,以便进行取证分析。我在想,是用Python的字符串好,还是用array()类型更合适呢?我最开始考虑用字符串,但我想避免出现Unicode的问题,所以也许用array('c')会更好?
2 个回答
如果你需要在原地修改缓冲区(不太清楚你是不是需要,因为你用的“处理”这个词有点模糊),那么array
可能更合适,因为str
字符串是不可变的。不过在Python 2.6或更高版本中,bytearray
可以兼顾两者的优点——既可以修改又有丰富的方法还能和正则表达式一起使用。
对于只读操作,字符串比array
更有优势(因为它有更多的方法,还有一些额外的功能,比如正则表达式),如果你用的是旧版Python,不能使用bytearray
的话就更是如此。在这两种情况下,Unicode都不是问题(在Python 2中;在Python 3中,一定要选择bytearray
!)。
写代码的时候,先用最自然的方式(字符串)来写,看看速度是否太慢,然后再进行优化。
在大多数情况下,数组可以直接替代 str
,只要你使用索引和切片来访问。它们的长度都是固定的,内存需求也差不多。数组是可变的,也就是说你可以修改它们的内容。如果需要从文件中读取数据,数组可以直接读取,这样就不会影响速度。
不过,我不太明白用数组怎么能避免Unicode的问题。str
其实就是一个字节数组,它并不知道字符串的编码方式。
我猜你提到的“磁盘缓冲区”可能会很大,所以你可以考虑使用 mmap
:
内存映射文件对象既像字符串,也像文件对象。不过,与普通字符串对象不同的是,这些是可变的。你可以在大多数需要字符串的地方使用mmap对象;比如,你可以用re模块在内存映射文件中搜索。因为它们是可变的,你可以通过像这样修改单个字符:obj[index] = 'a',或者通过切片来修改子字符串:obj[i1:i2] = '...'。你还可以从当前文件位置开始读写数据,并通过seek()在文件中跳转到不同的位置。