python - 有没有一种方法可以在不使用 Python API 的情况下执行 PyObject 的深层复制(例如通过 C、Rust 等)?

标签 python c deep-copy gil pyobject

我想知道是否有人知道我可以使用一个实现/库来执行 PyObject 的深层复制,而无需使用 Python API。

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

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

如果我可以在执行后(但在程序终止之前)分析变量,那将非常有帮助。为了做到这一点,我需要将变量保存在其他线程中(最好是不需要 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 ) 。您可以在 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++ deep copying with objects ) 在这种情况下,您必须为 Python 对象的副本分配内存,并手动复制每个子结构

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

更新:

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

关于python - 有没有一种方法可以在不使用 Python API 的情况下执行 PyObject 的深层复制(例如通过 C、Rust 等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66949286/

相关文章:

ios - 指向同一地址的两个对象不起作用。例如新数组 = 旧数组

从列表创建独立列表的 Pythonic 方法?

python - 为什么这个程序挂起?

c - 在 cmocka 单元测试框架的上下文中解释 mock()

连接字符串 (2)

c++ - 如何对对象执行深拷贝?你如何制作复制构造函数?

Java,这是深拷贝吗?

python - 图例中的分割标记和线条 - Matplotlib

python - 如何在 OpenMM 中计算单个原子之间的力

c++ - 使用 ESP Open SDK 部署到 ESP8266