在Python语言中,我最好使用memoryview、itertools.islice或其他东西(例如var = (start, stop))作为指向一个非常大字符串的子字符串的指针?
上下文:我有一些很长的字符串需要操作(剪切和粘贴子字符串等)。而不需要每次创建新的字符串。
为此,我创建了一个二进制搜索树,其中每个节点表示一个子字符串,然后使用拆分/合并操作(一种Rope数据结构)。
每个节点都需要一个指向该节点所代表的原始超大字符串的子字符串的引用。(这是必要的,因此,当我遍历树以生成最终编辑的字符串时,我可以按修改后的顺序取回原始字符串的各个部分。)
我可以将表示开始/停止值的元组附加到每个节点,然后使用分片string[start:stop],但在C中,您将使用一个指针和一个字符数。
用Python语言做一些类似的事情是不是更好,不管是用memoryview,还是用islice,或者其他什么?
发布于 2018-05-28 08:50:07
我对rope数据结构或您的特定需求还不够熟悉,不知道不复制数据的需求有多难。对于许多用例,在内存中有一个额外的副本不是问题,但一些优化或大文件可能需要其他解决方案。
在你列出的选项中,memory only是唯一不会在内存中创建额外副本的选项。有关更多信息,请参阅this问题,以及包含内存视图在何处有用的示例的答案。虽然它可以加快一些操作,如示例中的情况,但可能有更好的方法来解决问题或构建代码结构,从而消除了开始时的需要。当然,您的用例和里程可能会有所不同。
我还找到了一些关于memory mapped (mmap)文件和memoryview (py2中的buffer)接口的链接。如果你最终确实需要零拷贝指针,我绝对建议你去看看memoryview接口。
https://stackoverflow.com/questions/50557621
复制相似问题