【发布时间】:2021-11-12 19:13:45
【问题描述】:
我正在尝试获取 PyObject* 中保存的数据的内存地址(具体来自 Python.h 3.8.2),以便我可以对缓冲区执行 memcpy。我只能弄清楚如何将数据从对象中复制出来,但只是获取指针却一无所获。假设我有这个对象data ...
PyObject* data = PyLong_FromLong(100L);
目前看来,将这些数据转移到缓冲区的唯一选择是将其复制出来,然后使用临时变量的地址执行 memcpy ...
long temp = PyLong_AsLong(data);
memcpy(buffer, &temp, 8);
这已经完成了成千上万次,所以我认为如果我能够获取数据的内存地址并将其直接复制到我的缓冲区中会更快......
memcpy(buffer, data->address_to_data(), 8)
而不是将额外的副本复制到临时变量中。
有谁知道我是否/如何从 PyObject* 包装器中获取长值的内存地址?
感谢您的帮助!
【问题讨论】:
-
你觉得PyLong_AsVoidPtr怎么用?
-
一些值得指出的事情:1) PyLong 可以存储任意大的数字(即比 C
long大得多),因此实际上没有可以访问的内部long. 2)“通用python对象”可以包含指向其他Python对象的指针之类的东西,在复制它们时需要小心。 3)如果您正在寻找对数值的快速访问,那么也许您应该将array.array与缓冲区协议一起使用 -
@DavidW 感谢您的详细评论。您能否进一步扩展“
array.arraywith the buffer protocol”。我正在寻找将值放入缓冲区的最快方法。
标签: python c++ boost-python python-c-api