【发布时间】:2018-08-13 19:31:24
【问题描述】:
由于 python 执行slice-by-copy,因此对字符串进行切片可能会非常昂贵。
我有一个对字符串进行操作的递归算法。具体来说,如果向函数传递了一个字符串a,该函数会在传递的字符串的a[1:] 上调用自身。问题是字符串太长了,逐个复制机制正在成为删除第一个字符的一种非常昂贵的方法。
有没有办法解决这个问题,还是我需要完全重写算法?
【问题讨论】:
-
你说得对,我只是误解了 memoryview 的工作原理,并认为它是一样的。结束问题。
-
另外,
a[:1]正在切掉第一个字符(如果有的话),这非常便宜。你的意思是a[1:](它会分割所有但第一个字符)? -
是的,我做到了。谢谢你的收获。
-
@sudo:列表切片创建新的
lists;当然,不会复制 len 1str对象,但指向它们的指针会被复制,并且指针是 4-8 个字节,而字符串中的每个字符是 1-4 个字节。list切片的大 O 成本与str切片的成本相同。对于 Python 内置类型,只有O(1)切片的类型是memoryview和(在 Py3 上)range。numpy添加了一系列类似视图的序列,但它不是内置包。 -
@sudo:
str切片复制而不是部分创建视图以保持实现更简单(原始数据可以与对象头一起分配在单个块中,无需分配数据单独使用单独的引用计数,并避免将偏移量存储到数据中),并部分避免保活效应。如果有人做了类似smallstr = mystr[1:11]之类的事情,其中mystr的长度为1 GB,那么仅仅因为smallstr正在查看其中的10 个字符而让mystr永远存在是很荒谬的。