gpt4 book ai didi

python - Cython 指令 no_gc 的用法

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:04 24 4
gpt4 key购买 nike

在 Cython 0.25 中添加了 no_gc 指令。这个新指令(以及相关的 no_gc_clear 指令)的文档可以在 here 找到。 ,但我唯一真正了解它的是,它可以通过禁用垃圾收集的某些方面来加快代码速度。

我很感兴趣,因为我有一些使用扩展类型的高性能 Cython 代码,并且我知道 no_gc 可以进一步加快速度。在我的代码中,扩展类型的实例始终保持事件状态,直到程序关闭的最后,这使我认为禁用这些实例的垃圾收集可能没问题。

我想我真正需要的是一个例子,其中 no_gc 的使用变得并导致内存泄漏,并解释为什么会发生这种情况。

最佳答案

这与循环引用有关 - 当实例 a 持有对再次引用 a 的 Python 对象的引用时,a 永远不会被引用通过引用计数释放,因此 Python 尝试检测循环。

可能导致问题的类的一个非常试验的示例是:

# Cython code:

cdef class A:
cdef param

def __init__(self):
self.param = self

(以及一些运行它的 Python 代码)

import cython_module
while True:
cython_module.A()

这很好(循环被检测到并且它们经常被释放),但如果您添加 no_gc 那么您将耗尽内存。

更现实的示例可能是存储彼此引用的父/子对。

<小时/>

值得补充的是,性能提升可能很小。垃圾收集器仅在分配了大量对象而释放很少对象的情况下偶尔运行(https://docs.python.org/3/library/gc.html - 请参阅set_threshold)。希望这不太可能描述您的高性能代码。

使用 GC 分配和释放对象(从跟踪对象列表中添加/删除它们)可能会产生很小的性能成本(但同样,希望您没有分配/释放大量的对象)

<小时/>

最后,如果您的类从不存储任何对 Python 对象的引用,那么它实际上就是 no_gc 。设置该选项不会有坏处,但也没有好处。

关于python - Cython 指令 no_gc 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com