-
Notifications
You must be signed in to change notification settings - Fork 555
Optimizers cannot be freed by garbage collector #1028
Description
Repro, inspired from this blog post
import gc
from skopt import Optimizer
def dump_garbage():
gc.collect()
print("\nUNCOLLECTABLE OBJECTS:")
for x in gc.garbage:
s = str(x)
if len(s) > 80:
s = s[:77]+'...'
print(type(x),"\n ", s)
def non_leaky_list():
l = []
l.append(1)
del l
dump_garbage()
def leaky_list():
l = []
l.append(l)
del l
dump_garbage()
def make_optimizer():
opt = Optimizer([(-2.0, 2.0)], "GP", acq_func="EI",
acq_optimizer="sampling",
initial_point_generator="lhs")
del opt
dump_garbage()
if __name__ == "__main__":
gc.enable()
gc.set_debug(gc.DEBUG_SAVEALL)
print("Non Leaky List")
non_leaky_list()
print("Leaky list")
leaky_list()
print("Make Optimizer")
make_optimizer()The non_leaky_list and leaky_list functions were added as a sanity check that only leaky objects appear in gc.garbage. The output of the script should is shown bellow. We see that the leaky list is present ([[...]]) but also
skopt.optimizer.optimizer.Optimizer and all of the data created during optimizer init, e.g. class 'skopt.learning.gaussian_process.kernels.ConstantKernel
Non Leaky List
UNCOLLECTABLE OBJECTS:
Leaky list
UNCOLLECTABLE OBJECTS:
<class 'list'>
[[...]]
Make Optimizer
UNCOLLECTABLE OBJECTS:
<class 'list'>
[[...]]
<class 'list'>
[(-2.0, 2.0)]
<class 'skopt.optimizer.optimizer.Optimizer'>
<skopt.optimizer.optimizer.Optimizer object at 0x7fd0412ee220>
<class 'dict'>
{'self': <skopt.optimizer.optimizer.Optimizer object at 0x7fd0412ee220>, 'dim...
<class 'dict'>
{'args': {'self': <skopt.optimizer.optimizer.Optimizer object at 0x7fd0412ee2...
<class 'dict'>
{'specs': {'args': {'self': <skopt.optimizer.optimizer.Optimizer object at 0x...
<class 'list'>
['EI']
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fd0412da8b0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FD0...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fd0412fed30>
<class 'function'>
<function _parse_args_rvs at 0x7fd0412fedc0>
<class 'function'>
<function _parse_args_stats at 0x7fd0412fee50>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd040b2b580>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd040b2b730>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd040b2b850>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd05023b4f0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fd050133850>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FD0...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fd0412f2670>
<class 'function'>
<function _parse_args_rvs at 0x7fd0412feee0>
<class 'function'>
<function _parse_args_stats at 0x7fd0412fef70>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd050133a60>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412da970>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412dab50>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412dabb0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'skopt.learning.gaussian_process.kernels.ConstantKernel'>
1**2
<class 'list'>
[(0.01, 100)]
<class 'skopt.learning.gaussian_process.kernels.Matern'>
Matern(length_scale=1, nu=2.5)
<class 'dict'>
{'length_scale': array([1.]), 'length_scale_bounds': [(0.01, 100)], 'nu': 2.5}
<class 'skopt.learning.gaussian_process.kernels.Product'>
1**2 * Matern(length_scale=1, nu=2.5)
<class 'dict'>
{'k1': 1**2, 'k2': Matern(length_scale=1, nu=2.5)}
<class 'skopt.learning.gaussian_process.gpr.GaussianProcessRegressor'>
GaussianProcessRegressor(kernel=1**2 * Matern(length_scale=1, nu=2.5),
...
<class 'dict'>
{'noise': 'gaussian', 'kernel': 1**2 * Matern(length_scale=1, nu=2.5), 'alpha...
<class 'skopt.space.space.Real'>
Real(low=-2.0, high=2.0, prior='uniform', transform='normalize')
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fd0412dad90>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FD0...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fd0413080d0>
<class 'function'>
<function _parse_args_rvs at 0x7fd041308160>
<class 'function'>
<function _parse_args_stats at 0x7fd0413081f0>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd050285130>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0501febb0>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0501febe0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0501fea30>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'dict'>
{'low': -2.0, 'high': 2.0, 'prior': 'uniform', 'base': 10, 'log_base': 1.0, '...
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fd0501fe4f0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FD0...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fd041308040>
<class 'function'>
<function _parse_args_rvs at 0x7fd0413084c0>
<class 'function'>
<function _parse_args_stats at 0x7fd041308310>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412daaf0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412dad60>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412da820>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0501fe430>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'skopt.space.space.Space'>
Space([Real(low=-2.0, high=2.0, prior='uniform', transform='normalize')])
<class 'list'>
[Real(low=-2.0, high=2.0, prior='uniform', transform='normalize')]
<class 'dict'>
{'dimensions': [Real(low=-2.0, high=2.0, prior='uniform', transform='normaliz...
<class 'skopt.sampler.lhs.Lhs'>
<skopt.sampler.lhs.Lhs object at 0x7fd0501fec40>
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fd0412faaf0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FD0...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fd041308700>
<class 'function'>
<function _parse_args_rvs at 0x7fd041308430>
<class 'function'>
<function _parse_args_stats at 0x7fd041308280>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fabe0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fab80>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fab50>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fad00>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'list'>
[[-0.9562450357674332], [-1.5261686240142414], [1.5466107551472694], [1.09917...
<class 'list'>
[-0.9562450357674332]
<class 'list'>
[-1.5261686240142414]
<class 'list'>
[1.5466107551472694]
<class 'list'>
[1.0991719296735405]
<class 'list'>
[0.6375825894671845]
<class 'list'>
[-0.30089976205805025]
<class 'list'>
[-0.6264403552091107]
<class 'list'>
[-1.9754241793248664]
<class 'list'>
[1.9601303978300595]
<class 'list'>
[0.03623645754944249]
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fd0412faac0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FD0...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fd0413088b0>
<class 'function'>
<function _parse_args_rvs at 0x7fd0413083a0>
<class 'function'>
<function _parse_args_stats at 0x7fd0413085e0>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fae50>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fae20>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fadc0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412faa30>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._distn_infrastructure.rv_frozen'>
<scipy.stats._distn_infrastructure.rv_frozen object at 0x7fd0501fecd0>
<class 'dict'>
{'args': (), 'kwds': {'loc': 0.0, 'scale': 1.0000000000000002}, 'dist': <scip...
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fd0412fa9d0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FD0...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fd041308940>
<class 'function'>
<function _parse_args_rvs at 0x7fd041308790>
<class 'function'>
<function _parse_args_stats at 0x7fd041308a60>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fad60>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fa9a0>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd0412fa940>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fd04130c0a0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'skopt.space.transformers.Identity'>
<skopt.space.transformers.Identity object at 0x7fd0501c16d0>
<class 'skopt.space.transformers.Normalize'>
<skopt.space.transformers.Normalize object at 0x7fd0501feb80>
<class 'skopt.space.transformers.Pipeline'>
<skopt.space.transformers.Pipeline object at 0x7fd04130c100>
<class 'list'>
[<skopt.space.transformers.Identity object at 0x7fd0501c16d0>, <skopt.space.t...
<class 'dict'>
{'transformers': [<skopt.space.transformers.Identity object at 0x7fd0501c16d0...
<class 'list'>
[]
<class 'list'>
[0]
<class 'list'>
[]
<class 'list'>
[]
<class 'list'>
[]
I believe the issue is the call to inspect.get_currentframe, which the docs say can cause reference cycles.
I think using a deepcopy will help fix this problem - this is the output when I use a deepcopy as opposed to copy:
<class 'list'>
[[...]]
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fed684dc550>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FED...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fed98245ca0>
<class 'function'>
<function _parse_args_rvs at 0x7fed98245d30>
<class 'function'>
<function _parse_args_stats at 0x7fed98245dc0>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed880934c0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9816e130>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9816ea30>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9805b850>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fed98136ac0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FED...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fed982354c0>
<class 'function'>
<function _parse_args_rvs at 0x7fed98245e50>
<class 'function'>
<function _parse_args_stats at 0x7fed98245ee0>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed684d2af0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed684d21f0>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed98136a30>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed98136880>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fed98136610>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FED...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fed98253040>
<class 'function'>
<function _parse_args_rvs at 0x7fed982530d0>
<class 'function'>
<function _parse_args_stats at 0x7fed98253160>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed98136c40>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed98136af0>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed981364f0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f610>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fed9823f760>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FED...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fed98245f70>
<class 'function'>
<function _parse_args_rvs at 0x7fed98253430>
<class 'function'>
<function _parse_args_stats at 0x7fed98253280>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f7c0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f7f0>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f790>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f640>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fed9823fbe0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FED...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fed98253670>
<class 'function'>
<function _parse_args_rvs at 0x7fed982533a0>
<class 'function'>
<function _parse_args_stats at 0x7fed982531f0>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823fd00>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823fca0>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f9a0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823fe20>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fed9823f9d0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FED...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fed98253820>
<class 'function'>
<function _parse_args_rvs at 0x7fed98253310>
<class 'function'>
<function _parse_args_stats at 0x7fed98253550>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823ff10>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823ff70>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823fc70>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823fee0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
<class 'scipy.stats._continuous_distns.uniform_gen'>
<scipy.stats._continuous_distns.uniform_gen object at 0x7fed9823faf0>
<class 'dict'>
{'_stats_has_moments': False, '_random_state': RandomState(MT19937) at 0x7FED...
<class 'dict'>
{'__builtins__': {'__name__': 'builtins', '__doc__': "Built-in functions, exc...
<class 'tuple'>
(0, 1)
<class 'tuple'>
(0, 1, None)
<class 'tuple'>
(0, 1, 'mv')
<class 'function'>
<function _parse_args at 0x7fed982538b0>
<class 'function'>
<function _parse_args_rvs at 0x7fed98253700>
<class 'function'>
<function _parse_args_stats at 0x7fed982539d0>
<class 'method'>
<bound method _parse_args of <scipy.stats._continuous_distns.uniform_gen obje...
<class 'method'>
<bound method _parse_args_stats of <scipy.stats._continuous_distns.uniform_ge...
<class 'method'>
<bound method _parse_args_rvs of <scipy.stats._continuous_distns.uniform_gen ...
<class 'method'>
<bound method rv_continuous._ppf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f730>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._ppf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method uniform_gen._entropy of <scipy.stats._continuous_distns.uniform...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823fe80>
<class 'dict'>
{'pyfunc': <bound method uniform_gen._entropy of <scipy.stats._continuous_dis...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._cdf_single of <scipy.stats._continuous_distns.un...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9823f5b0>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._cdf_single of <scipy.stats._continuou...
<class 'set'>
set()
<class 'method'>
<bound method rv_continuous._mom1_sc of <scipy.stats._continuous_distns.unifo...
<class 'numpy.vectorize'>
<numpy.vectorize object at 0x7fed9825e130>
<class 'dict'>
{'pyfunc': <bound method rv_continuous._mom1_sc of <scipy.stats._continuous_d...
<class 'set'>
set()
The only thing that sticks out are all the scipy.stats objects that are marked uncollectable. I think that is a scipy issue though, I can reproduce a similar output just from creating a uniform distribution with scipy. Might be worth to follow up in the scipy repo.
import gc
from scipy.stats.distributions import uniform
def dump_garbage():
gc.collect()
print("\nUNCOLLECTABLE OBJECTS:")
for x in gc.garbage:
s = str(x)
if len(s) > 80:
s = s[:77]+'...'
print(type(x),"\n ", s)
def non_leaky_list():
l = []
l.append(1)
del l
dump_garbage()
def leaky_list():
l = []
l.append(l)
del l
dump_garbage()
def make_uniform_dist():
uni = uniform(loc=0, scale=1)
del uni
dump_garbage()
if __name__ == "__main__":
gc.enable()
gc.set_debug(gc.DEBUG_SAVEALL)
print("Non Leaky List")
non_leaky_list()
print("Leaky list")
leaky_list()
print("Make uniform")
make_uniform_dist()