2015-12-20 15 views
8

Profiling mein Code in IPython mit% Prun, habe ich festgestellt, dass der Großteil der Funktionszeit in Garbage Collection (0,334s vs. 0,428 Gesamtzeit) verbracht wird.Warum ist die Müllsammlung so langsam?

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) 

habe ich versucht, Sperren/Freigeben der Speicherbereinigungs vor dem Funktionsaufruf und nach seinem Wert zurückkehrt, aber das Timing ist praktisch identisch.

import gc 

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

Weiß jemand, warum dies ein solcher Engpass ist und wie man es beschleunigen kann?

Meine Python/Pandas Versionen sind unten aufgeführt:

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

ich Ihren Code erraten oft Müll viel produziert. –

+1

Ich denke, die Antwort ist "Nein", aber können Sie hier irgendeinen Code teilen? Sonst könnten Sie vielleicht etwas schreiben, das dieses GC-Problem demonstriert. : s –

+0

@AndyHayden Ich bin immer noch Profiler. Es sieht so aus, als ob der Engpass eine Funktion ist, die viele Regressionen ausführt. Wenn ich ein MVE zusammenstellen kann, werde ich meinen Beitrag bearbeiten. – Alexander

Antwort

0

Sie deaktiviert gc so könnte es tatsächlich etwas gc.collect explizit aufrufen. Sie können möglicherweise die Täter unter Verwendung dieser Trick in IPython finden:

import gc 
import traceback 

old_collect = gc.collect 

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

gc.collect = new_collect 

Hinweis es funktioniert nur, wenn der Code import gc tut, ist es nicht mit from gc import collect arbeiten (wir das gc Modul manipulieren).

Bitte melden Sie einen Fehler, wenn Sie es herausfinden.