有没有一种方法可以在不使用 Python API 的情况下执行 PyObject 的深层复制(例如通过 C、Rust 等)?
Is there a way to perform a deep copy of a PyObject without using the Python API (e.g. via C, Rust, etc)?
我想知道是否有人知道 implementation/library 我可以在不使用 Python API.
的情况下执行 PyObject 的深层复制
我更喜欢 C 语言的东西(我目前使用的,并且对 CFFI 有点熟悉),但是任何东西(无论是什么语言——例如 RUST),我都会非常感激。
这样做的原因是,我正在尝试执行 Python 变量的分析(对于实时 Python 调试库),但不想执行在正在分析的程序执行期间进行分析(因为这会极大地影响程序性能)。
如果我能分析变量 post-执行(但在程序终止之前),那将非常有帮助。为此,我需要将变量保存在其他线程中(最好是不需要 GIL 的 C 程序 - 这样主 Python 程序可以不间断地继续执行)。
我个人不认为那里有任何东西,正如我已经看过的那样,但我认为在 Stack Overflow 上问问某人可能值得一试。
谢谢。
在 C 中有 memcpy
用于制作结构的深层副本,结构 是您可以获得的最接近 OOP 中的对象的等价物。所以如果你能得到Python对象在内存中的大小和它的内存位置你可以使用memcpy()
来深拷贝它(Deep copying array in C... malloc?, Making a deep copy of a struct...making a shallow copy of a struct). You can do this from within Python by either writing an additional module (https://docs.python.org/3/extending/extending.html) or mechanisms like cython (https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html)
然而,如果 Python 对象包含指向子结构的指针 memcpy
将不会产生深拷贝 (C++ deep copying with objects)
在这种情况下,您必须为 Python 对象的副本分配内存,并手动复制每个子结构
https://agiledeveloper.com/articles/cloning072002.htm - 为什么复制对象是一件可怕的事情?
更新:
如评论中所述,使用 C memcpy
不是最佳解决方案,因为子结构可能实现为指针。所以也许尝试使用 Python 的 copy
模块 ( https://pymotw.com/2/copy/ ) 或分析其源代码并根据您的需要进行调整
我想知道是否有人知道 implementation/library 我可以在不使用 Python API.
的情况下执行 PyObject 的深层复制我更喜欢 C 语言的东西(我目前使用的,并且对 CFFI 有点熟悉),但是任何东西(无论是什么语言——例如 RUST),我都会非常感激。
这样做的原因是,我正在尝试执行 Python 变量的分析(对于实时 Python 调试库),但不想执行在正在分析的程序执行期间进行分析(因为这会极大地影响程序性能)。
如果我能分析变量 post-执行(但在程序终止之前),那将非常有帮助。为此,我需要将变量保存在其他线程中(最好是不需要 GIL 的 C 程序 - 这样主 Python 程序可以不间断地继续执行)。
我个人不认为那里有任何东西,正如我已经看过的那样,但我认为在 Stack Overflow 上问问某人可能值得一试。
谢谢。
在 C 中有 memcpy
用于制作结构的深层副本,结构 是您可以获得的最接近 OOP 中的对象的等价物。所以如果你能得到Python对象在内存中的大小和它的内存位置你可以使用memcpy()
来深拷贝它(Deep copying array in C... malloc?, Making a deep copy of a struct...making a shallow copy of a struct). You can do this from within Python by either writing an additional module (https://docs.python.org/3/extending/extending.html) or mechanisms like cython (https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html)
然而,如果 Python 对象包含指向子结构的指针 memcpy
将不会产生深拷贝 (C++ deep copying with objects)
在这种情况下,您必须为 Python 对象的副本分配内存,并手动复制每个子结构
https://agiledeveloper.com/articles/cloning072002.htm - 为什么复制对象是一件可怕的事情?
更新:
如评论中所述,使用 C memcpy
不是最佳解决方案,因为子结构可能实现为指针。所以也许尝试使用 Python 的 copy
模块 ( https://pymotw.com/2/copy/ ) 或分析其源代码并根据您的需要进行调整