这对于缓冲区操作更有效:python strings或array()

时间:2010-02-04 13:41:07

标签: python arrays performance

我正在构建一个例程来处理磁盘缓冲区以进行取证。我最好使用python字符串或array()类型吗?我的第一个想法是使用字符串,但我试图消除unicode问题,所以也许数组('c')更好?

2 个答案:

答案 0 :(得分:9)

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

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

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

我认为您提到的“磁盘缓冲区”可能相当大,因此您可能会考虑使用mmap

  

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

答案 1 :(得分:6)

如果你需要改变缓冲区(你不清楚是否这样做,因为你使用模糊术语“处理”),array可能会更好,因为str是不可变的。但是,在Python 2.6或更高版本中,bytearray可以是两个世界中最好的 - 可变丰富的方法也可用于正则表达式。< / p>

对于只读操作,字符串的边缘超过array(多亏了更多的方法,加上正则表达式等附加内容,可用于它们),如果你遇到旧的Python版本,那么就不能使用bytearray。在任何一种情况下,Unicode都不是问题(在Python 2中;在Python 3中,绝对转到bytearray! - )。