2015-12-20 17 views
8

Profilowanie mojego kodu w IPython przy użyciu% prun, zauważyłem, że większość czasu funkcji spędza się w garbage collection (0,343 s vs. 0,428 całkowity czas).Dlaczego pobieranie śmieci jest tak wolne?

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) 

Próbowałem wyłączenia/włączenia zbieranie śmieci przed wywołaniem funkcji i po powrocie jego wartość, ale termin jest praktycznie identyczny.

import gc 

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

Czy ktoś wie, dlaczego jest to wąskie gardło i jak je przyspieszyć?

wersje My Python/Pandy są wymienione poniżej:

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

Chyba kod produkuje dużo oft śmieci. –

+1

Domyślam się, że odpowiedź brzmi "nie", ale czy możesz tutaj udostępnić dowolny kod? W przeciwnym razie możesz napisać coś, co demonstruje ten problem z gc. : s –

+0

@AndyHayden Nadal tworzę profil. Wygląda na to, że wąskie gardło to funkcja, która uruchamia wiele regresji. Jeśli mogę utworzyć MVE, będę edytować mój post. – Alexander

Odpowiedz

0

wyłączono gc więc nie może być faktycznie coś dzwoni gc.collect wyraźnie. Można ewentualnie znaleźć sprawcę za pomocą tego triku w 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 

Uwaga to działa tylko wtedy, gdy kod nie import gc, że nie działa z from gc import collect (jesteśmy manipulacji modułu GC).

Proszę zgłosić błąd, jeśli się o tym dowiesz.

0

Usuwanie śmieci powoduje, że wszystko dzieje się wolniej. To także sprawia, że ​​wszystko jest o wiele mniej podatne na błędy.

Oto kilka dobrych artykułów na temat tego konkretnego tematu:

Python Garbage
Only slow if you use it wrong

+0

hej, tylko wolno mówi:" TODO: dowiedz się, co miał na myśli "w dziale GC – kilojoules

Powiązane problemy