运行二进制可执行程序(使用cython从python转换而来)时的垃圾回收

2024-05-29 02:10:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我用cython把一个python程序转换成二进制。转换后的python程序也在调用一些c函数。你知道吗

我注意到,当程序持续运行时,内存消耗会稳步增加,在某个阈值之后会下降,然后会增加,循环会重复。你知道吗

但如果我没有错的话,这种行为只会发生在垃圾上收藏家。怎么做垃圾收集器是在一个二进制程序中出现的,尽管它是由python编写的?你知道吗

如果二进制程序在python解释器之外运行,那么谁在调用垃圾收集器?你知道吗


Tags: 函数内存程序二进制阈值解释器cython垃圾
1条回答
网友
1楼 · 发布于 2024-05-29 02:10:36

我认为这个问题是基于对赛顿的一些误解。你知道吗

Cython生成的代码不是独立的。相反,它的大部分是通过调用libpython中的函数来工作的。这些函数与解释普通Python代码时Python解释器调用的函数完全相同。因此,您应该期望像垃圾收集器这样的东西会以完全相同的方式运行。Cython中的大多数变量仍然是PyObjects-与Python使用的结构完全相同,它们仍然以相同的方式分配:通过调用PyObject_NewThe documentation将垃圾收集器触发器描述为:

When the number of allocations minus the number of deallocations exceeds threshold0, collection starts

由于Cython对PyObject的分配和释放机制与解释的Python代码相同,因此没有理由相信这会有任何不同。你知道吗

此外,实际上,您应该期望许多Python程序运行大量已解释的Python代码。如果在Cython中import一个模块,那么该模块将以标准方式运行。如果该模块是一个普通的Python模块,那么它将在解释器中运行。您真的无法将Cython与libpython或Python解释器(它是libpython的一部分)分开。你知道吗


最后,您所描述的行为是否是垃圾收集器还不清楚:它可能只是普通的引用计数机制。一个对象保存大量其他对象的引用是很常见的。当单个对象被销毁时(例如在循环的每次迭代中),它最终也会释放它持有引用的大多数其他对象。如果您想知道GC是否在运行,那么可以查看gc.get_stats()(python3.4以上)

相关问题 更多 >

    热门问题