+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()