2015-12-20 12 views
8

Profilando il mio codice in IPython usando% prun, ho notato che la maggior parte del tempo di funzionamento viene speso nella garbage collection (0,334 vs 0,428 tempo totale).Perché la raccolta dei rifiuti è così lenta?

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) 

Ho provato disabilitazione/abilitazione della raccolta dei rifiuti prima di chiamare la funzione e dopo il ritorno suo valore, ma i tempi è praticamente identico.

import gc 

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

Qualcuno sa perché questo è un collo di bottiglia e come accelerarlo?

versioni mio Python/panda sono elencati di seguito:

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

Credo che il codice produce un sacco oft spazzatura. –

+1

Suppongo che la risposta sia "no", ma puoi condividere qualsiasi codice qui? Altrimenti potresti scrivere qualcosa che mostri questo problema gc. : s –

+0

@AndyHayden Sto ancora creando un profilo. Sembra che il collo di bottiglia sia una funzione che esegue molte regressioni. Se riesco a mettere insieme un MVE, modifico il mio post. – Alexander

risposta

0

È disattivato gc quindi ci potrebbe essere in realtà qualcosa chiamando gc.collect esplicitamente. È forse possibile trovare il colpevole utilizzando questo trucco in 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 

Nota funziona solo se il codice fa import gc, non funziona con from gc import collect (stiamo manipolando il modulo GC).

Segnala un errore se lo scopri.

0

La raccolta dei rifiuti rende tutto più lento. Rende anche tutto meno incline agli errori.

Ecco alcuni buoni articoli su questo argomento specifico:

Python Garbage
Only slow if you use it wrong

+0

heh, solo lento dice" TODO: scopri cosa intendeva in qualche modo "nella sezione GC – kilojoules

Problemi correlati