2015-12-20 19 views
8

%prunを使用してIPythonで自分のコードをプロファイリングすると、関数の時間の大部分がガベージコレクションに費やされていることがわかりました(0.334秒対0.428時間)。なぜガベージコレクションが遅いのですか?

79254 function calls (77408 primitive calls) in 0.428 seconds 

Ordered by: internal time 

ncalls tottime percall cumtime percall filename:lineno(function) 
    5 0.334 0.067 0.334 0.067 {gc.collect} 
15757 0.005 0.000 0.007 0.000 {isinstance} 
    1584 0.002 0.000 0.004 0.000 dtypes.py:68(is_dtype) 

私は関数を呼び出す前に、その値を戻した後、ガベージコレクションを有効/無効にしようとしましたが、タイミングが実質的に同じです。

import gc 

gc.disable() 
x = foo() 
gc.disable() 

なぜこのようなボトルネックであり、スピードアップするのか誰にも分かりますか?

私のPython /パンダのバージョンは以下の通りです:

Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec 6 2015, 18:57:58) 
Pandas 0.17.1 
+4

:ここ

は、この特定のトピックに関するいくつかの良い記事です。 –

+1

答えは「いいえ」と思いますが、ここでコードを共有することはできますか?そうでなければ、おそらくあなたはこのgcの問題を示す何かを書くことができます。 :s –

+0

@AndyHayden私はまだプロファイリングしています。ボトルネックは、多くの回帰を実行する関数であるように見えます。 MVEをまとめることができれば、投稿を編集します。 – Alexander

答えて

0

あなたが無効になっgcので、明示的にgc.collectを呼び出して実際に何かがあるかもしれません。あなたはおそらくIPythonでこのトリックを使って犯人を見つけることができます。

import gc 
import traceback 

old_collect = gc.collect 

def new_collect(*args, **kwargs): 
    traceback.print_stack() 
    old_collect(*args, **kwargs) 

gc.collect = new_collect 

は、それがコードがimport gcを行う場合にのみ、それは(私たちはGCモジュールを操作している)from gc import collectでは動作しません動作します。

見つけた場合は、バグを報告してください。

0

ガベージコレクションではすべての処理が遅くなります。また、すべてがエラーを起こしにくいものになります。私はあなたのコードがたくさんOFTゴミを生産推測

Python Garbage
Only slow if you use it wrong

+0

heh、遅いだけです。「TODO:GCセクションで何とかしていたことを見つけてください」 – kilojoules

関連する問題