指向Python子串的指针:memoryview vs itertools.islice vs ...?

时间:2018-05-28 00:07:53

标签: python string data-structures binary-search-tree

我会更好地使用memoryviewitertools.islice或其他内容(例如var = (start, stop))作为Python中的指针指向非常大的字符串的子字符串吗?

上下文:我需要操作一些非常长的字符串(剪切和粘贴子字符串等),而不是每次都创建一个新的字符串。

我通过创建一个二元搜索树来实现这一点,其中每个节点代表一个子字符串,然后使用拆分/合并操作(一个绳索数据结构)。

每个节点都需要一个引用附加到该节点所代表的原始非常大的字符串的子字符串。 (这是必要的,当我按顺序走树以产生最终编辑的字符串时,我会在修改的序列中找回原始字符串的部分。)

我可以将表示开始/停止值的元组附加到每个节点,然后使用切片string[start:stop],但在C中你将使用指针和字符数。

使用memoryviewislice或其他内容在Python中执行类似操作会更好吗?

1 个答案:

答案 0 :(得分:1)

我对绳索数据结构或您的具体要求不太熟悉,以了解复制数据的要求有多难。对于许多在内存中具有额外副本的用例不是问题,但是某些优化或大文件可能需要其他解决方案。

在您列出的选项中,memoryview是唯一不会在内存中创建其他副本的选项。有关更多信息,请参阅this问题,以及包含内存视图有用的示例的答案。虽然它可以加速某些操作,如示例中的情况,但可能有更好的方法来解决问题或构建代码,从而无需开始。您的使用案例和里程可能会有所不同。

我还发现了一些关于memory mapped (mmap)文件和memoryview(py2中的缓冲区)接口的链接。如果你最终需要零拷贝指针,我肯定建议你查看一下memoryview接口。