2016-11-09 2 views
1

Cython 0.25では、no_gcディレクティブが追加されました。この新しいディレクティブ(および関連するno_gc_clearディレクティブ)のドキュメントはhereですが、私が実際に理解している唯一のことは、コードを高速化してガベージコレクションの特定の側面を無効にできることです。Cythonディレクティブno_gcの使用

拡張タイプを使用する高性能Cythonコードがあるので、私は興味があります。no_gcはさらに処理を高速化できることを理解しています。私のコードでは、エクステンション型のインスタンスは、プログラムが終了するときの終わりまで常に生きています。このため、ガベージコレクションを無効にすることはOKかもしれません。私は、私が本当に必要なものを推測

no_gcの使用量が悪いを行くと一緒にそれが起こる正確に理由の説明ENと、メモリリークにつながる例です。

答えて

1

それは循環参照を行うことです - インスタンスaはPythonがサイクルを検出しようとしますので、参照カウントを通じて再びaが解放されることはありません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を使用して、オブジェクトの割り当てと解放の小さなパフォーマンスのコストが、またおそらくだ追加する/追跡オブジェクトのリストから削除します(しかし、再び、うまくいけば、あなたは膨大な数のdeallocting /割り当てされていません)


最後に、クラスにPythonオブジェクトへの参照が一度も格納されない場合は、とにかくno_gcとなります。オプションを設定するだけで害はありませんが、良いもしません。

関連する問題