2

我想知道是否有人知道我可以用来在不使用 Python API 的情况下执行 PyObject 的深层副本的实现/库。

我更喜欢 C 中的某些东西(正如我目前使用的那样,并且对 CFFI 有点熟悉),但任何东西(无论是哪种语言 - 例如 RUST),都将不胜感激。

这样做的原因是,我正在尝试对 Python 变量进行分析(对于实时 Python 调试库),但不想在正在分析的程序执行期间执行分析(因为那样会极大地影响程序性能)。

如果我可以在执行后(但在程序终止之前)分析变量,那将非常有帮助。为了做到这一点,我需要将变量保存在其他线程中(最好是不需要 GIL 的 C 程序 - 以便主 Python 程序可以不间断地继续执行)。

我个人认为那里没有任何东西,因为我已经看过了,但认为在 Stack Overflow 上询问某人可能值得一试。

谢谢你。

4

1 回答 1

2

在 C 语言中,memcpy用于制作结构的深层副本,而结构与OOP中的对象最接近,您可以获得。因此,如果您可以获得内存中 Python 对象的大小及其内存位置,您可以使用memcpy()它来深度复制它(Deep copying array in C... malloc? , Making a deep copy of a struct...making a shallow copy结构)。您可以在 Python 中通过编写附加模块 ( https://docs.python.org/3/extending/extending.html ) 或 cython 等机制 ( https://cython.readthedocs.io/en/latest /src/userguide/external_C_code.html )

但是,如果 Python 对象包含指向子结构的指针,memcpy则不会产生深拷贝(C++ 深拷贝对象)在这种情况下,您必须为 Python 对象的副本分配内存并手动复制每个子结构

https://agiledeveloper.com/articles/cloning072002.htm -为什么复制对象是一件可怕的事情?

更新 :

如评论中所述,使用 Cmemcpy不是最佳解决方案,因为子结构可能实现为指针。因此,也许可以尝试使用 Python 的copy模块(https://pymotw.com/2/copy/)或分析其源代码并根据您的需要进行调整

于 2021-04-05T11:02:34.710 回答