能否无复制从原生指针或张量缓冲区创建Python字符串?
核心需求与技术疑问
需求背景
- 将大量字符串存储在PyTorch/NumPy张量中(例如采用固定大小的UTF-32 4字节字符格式,甚至可通过mmap映射自磁盘),并使用Python3字符串API对其进行操作。
- 为实现极致优雅性、节省Python对象开销、手动管理内存池(也出于纯粹好奇心),希望零拷贝从底层缓冲区创建原生Python字符串,不触发缓冲区复制。
核心疑问
- 查阅
PyUnicode_FromKindAndData文档得知其「必要时会复制输入缓冲区并转换为标准表示」,想确认:若底层字节格式无需转换,该函数是否仍会复制缓冲区? - 是否存在其他实现零拷贝创建Python字符串的方法?(已了解
PyUnicode_4BYTE_DATA接口) - 最直白的问题:能否将ASCII字节指针转换为对应缓冲区的Python字符串视图,且不进行任何缓冲区复制(由开发者自行负责缓冲区的内存管理)?
补充更新
- UPD1:经讨论后确认,
PyUnicode_FromKindAndData似乎会调用PyUnicode_New,再通过memcpy将数据拷贝至PyUnicode对象中。因此问题可改写为:能否创建带有正确编码信息的空字符串对象,再通过ctypes直接设置其data和size字段? - UPD2:已在CPython仓库创建议题,用于与Python开发者讨论该问题。
内容的提问来源于stack exchange,提问作者Vadim Kantorov
相关产品推荐
相关产品推荐

