Python子串提取的效率如何?

4 投票
4 回答
2250 浏览
提问于 2025-04-15 20:29

我有一个文本文件的全部内容(至少几千字节)存储在字符串 myStr 中。

下面这段代码会在内存中创建一个字符串的副本吗?这个副本会去掉第一个字符。

myStr = myStr[1:]

我希望它只是指向同一个内部存储区域的不同位置。如果不是,有没有更有效的方法来做到这一点?

谢谢!

注意:我使用的是 Python 2.5。

4 个回答

1

根据你正在做的事情,itertools.islice 可能是一个合适的、节省内存的解决方案(如果需要的话)。

3

像大多数有垃圾回收机制的编程语言一样,字符串会根据需要频繁创建。这是因为如果要追踪子字符串,就会让垃圾回收变得更加复杂。

你想实现的具体算法是什么?如果我们能多了解一些,或许能给你一些更好的建议。

至于替代方案,你到底需要做什么呢?有没有可能换个角度来看这个问题,比如只保留一个整数索引来指向字符串?你能不能使用一个 array.array('u')

4

在2.6版本中,字符串的切片操作总是会分配新的内存。也就是说,当你用string_slice()这个函数时,它会调用PyString_FromStringAndSize()来创建一个新的字符串。这个过程不会重复使用之前的内存,这有点奇怪,因为对于不变的字符串来说,应该比较容易做到这一点。

除了缓冲区API(你可能不想用这个),没有更有效的方法来完成这个操作。

撰写回答