2024-05-29 02:10:36 发布
网友
我用cython把一个python程序转换成二进制。转换后的python程序也在调用一些c函数。你知道吗
我注意到,当程序持续运行时,内存消耗会稳步增加,在某个阈值之后会下降,然后会增加,循环会重复。你知道吗
但如果我没有错的话,这种行为只会发生在垃圾上收藏家。怎么做垃圾收集器是在一个二进制程序中出现的,尽管它是由python编写的?你知道吗
如果二进制程序在python解释器之外运行,那么谁在调用垃圾收集器?你知道吗
我认为这个问题是基于对赛顿的一些误解。你知道吗
Cython生成的代码不是独立的。相反,它的大部分是通过调用libpython中的函数来工作的。这些函数与解释普通Python代码时Python解释器调用的函数完全相同。因此,您应该期望像垃圾收集器这样的东西会以完全相同的方式运行。Cython中的大多数变量仍然是PyObjects-与Python使用的结构完全相同,它们仍然以相同的方式分配:通过调用PyObject_New。The documentation将垃圾收集器触发器描述为:
libpython
PyObject
PyObject_New
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的一部分)分开。你知道吗
import
最后,您所描述的行为是否是垃圾收集器还不清楚:它可能只是普通的引用计数机制。一个对象保存大量其他对象的引用是很常见的。当单个对象被销毁时(例如在循环的每次迭代中),它最终也会释放它持有引用的大多数其他对象。如果您想知道GC是否在运行,那么可以查看gc.get_stats()(python3.4以上)
gc.get_stats()
我认为这个问题是基于对赛顿的一些误解。你知道吗
Cython生成的代码不是独立的。相反,它的大部分是通过调用
libpython
中的函数来工作的。这些函数与解释普通Python代码时Python解释器调用的函数完全相同。因此,您应该期望像垃圾收集器这样的东西会以完全相同的方式运行。Cython中的大多数变量仍然是PyObject
s-与Python使用的结构完全相同,它们仍然以相同的方式分配:通过调用PyObject_New
。The documentation将垃圾收集器触发器描述为:由于Cython对
PyObject
的分配和释放机制与解释的Python代码相同,因此没有理由相信这会有任何不同。你知道吗此外,实际上,您应该期望许多Python程序运行大量已解释的Python代码。如果在Cython中
import
一个模块,那么该模块将以标准方式运行。如果该模块是一个普通的Python模块,那么它将在解释器中运行。您真的无法将Cython与libpython
或Python解释器(它是libpython
的一部分)分开。你知道吗最后,您所描述的行为是否是垃圾收集器还不清楚:它可能只是普通的引用计数机制。一个对象保存大量其他对象的引用是很常见的。当单个对象被销毁时(例如在循环的每次迭代中),它最终也会释放它持有引用的大多数其他对象。如果您想知道GC是否在运行,那么可以查看
gc.get_stats()
(python3.4以上)相关问题 更多 >
编程相关推荐