+1 on a C API for enabling and disabling GC.
I have several instances where I create a large number of objects non-cyclic
objects where I see huge GC overhead (30+ seconds with gc enabled, 0.15
seconds when disabled).
+1000 to fixing the garbage collector to be smart enough to self-regulate
itself better.
In the mean time, I use the following context manager to deal with the
hotspots as I find them:
class gcdisabled(object):
'''
Conext manager to temporarily disable Python's cyclic garbage collector.
The primary use is to avoid thrashing while allocating large numbers of
non-cyclic objects due to an overly aggressive garbage collector behavior.
Will disable GC if it is enabled upon entry and renable upon exit:
>>> gc.isenabled()
True
>>> with gcdisabled():
... print gc.isenabled()
False
>>> print gc.isenabled()
True
Will not reenable if GC was disabled upon entry:
>>> gc.disable()
>>> gc.isenabled()
False
>>> with gcdisabled():
... gc.isenabled()
False
>>> gc.isenabled()
False
'''
def __init__(self):
self.isenabled = gc.isenabled()
def __enter__(self):
gc.disable()
def __exit__(self, type, value, traceback):
if self.isenabled:
gc.enable()
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com