Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/boltons/gcutils.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/boltons/gcutils.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -# -*- coding: utf-8 -*- -"""The Python Garbage Collector (`GC`_) doesn't usually get too much -attention, probably because: - - - Python's `reference counting`_ effectively handles the vast majority of - unused objects - - People are slowly learning to avoid implementing `object.__del__()`_ - - The collection itself strikes a good balance between simplicity and - power (`tunable generation sizes`_) - - The collector itself is fast and rarely the cause of long pauses - associated with GC in other runtimes - -Even so, for many applications, the time will come when the developer -will need to track down: - - - Circular references - - Misbehaving objects (locks, ``__del__()``) - - Memory leaks - - Or just ways to shave off a couple percent of execution time - -Thanks to the :mod:`gc` module, the GC is a well-instrumented entry -point for exactly these tasks, and ``gcutils`` aims to facilitate it -further. - -.. _GC: https://docs.python.org/2/glossary.html#term-garbage-collection -.. _reference counting: https://docs.python.org/2/glossary.html#term-reference-count -.. _object.__del__(): https://docs.python.org/2/glossary.html#term-reference-count -.. _tunable generation sizes: https://docs.python.org/2/library/gc.html#gc.set_threshold -""" -# TODO: type survey - -from __future__ import print_function - -import gc -import sys - -__all__ = ['get_all', 'GCToggler', 'toggle_gc', 'toggle_gc_postcollect'] - - -def get_all(type_obj, include_subtypes=True): - """Get a list containing all instances of a given type. This will - work for the vast majority of types out there. - - >>> class Ratking(object): pass - >>> wiki, hak, sport = Ratking(), Ratking(), Ratking() - >>> len(get_all(Ratking)) - 3 - - However, there are some exceptions. For example, ``get_all(bool)`` - returns an empty list because ``True`` and ``False`` are - themselves built-in and not tracked. - - >>> get_all(bool) - [] - - Still, it's not hard to see how this functionality can be used to - find all instances of a leaking type and track them down further - using :func:`gc.get_referrers` and :func:`gc.get_referents`. - - ``get_all()`` is optimized such that getting instances of - user-created types is quite fast. Setting *include_subtypes* to - ``False`` will further increase performance in cases where - instances of subtypes aren't required. - - .. note:: - - There are no guarantees about the state of objects returned by - ``get_all()``, especially in concurrent environments. For - instance, it is possible for an object to be in the middle of - executing its ``__init__()`` and be only partially constructed. - """ - # TODO: old-style classes - if not isinstance(type_obj, type): - raise TypeError('expected a type, not %r' % type_obj) - try: - type_is_tracked = gc.is_tracked(type_obj) - except AttributeError: - type_is_tracked = False # Python 2.6 and below don't get the speedup - if type_is_tracked: - to_check = gc.get_referrers(type_obj) - else: - to_check = gc.get_objects() - - if include_subtypes: - ret = [x for x in to_check if isinstance(x, type_obj)] - else: - ret = [x for x in to_check if type(x) is type_obj] - return ret - - -_IS_PYPY = '__pypy__' in sys.builtin_module_names -if _IS_PYPY: - # pypy's gc is just different, y'all - del get_all - - -class GCToggler(object): - """The ``GCToggler`` is a context-manager that allows one to safely - take more control of your garbage collection schedule. Anecdotal - experience says certain object-creation-heavy tasks see speedups - of around 10% by simply doing one explicit collection at the very - end, especially if most of the objects will stay resident. - - Two GCTogglers are already present in the ``gcutils`` module: - - - :data:`toggle_gc` simply turns off GC at context entrance, and - re-enables at exit - - :data:`toggle_gc_postcollect` does the same, but triggers an - explicit collection after re-enabling. - - >>> with toggle_gc: - ... x = [object() for i in range(1000)] - - Between those two instances, the ``GCToggler`` type probably won't - be used much directly, but is documented for inheritance purposes. - """ - def __init__(self, postcollect=False): - self.postcollect = postcollect - - def __enter__(self): - gc.disable() - - def __exit__(self, exc_type, exc_val, exc_tb): - gc.enable() - if self.postcollect: - gc.collect() - - -toggle_gc = GCToggler() -"""A context manager for disabling GC for a code block. See -:class:`GCToggler` for more details.""" - - -toggle_gc_postcollect = GCToggler(postcollect=True) -"""A context manager for disabling GC for a code block, and collecting -before re-enabling. See :class:`GCToggler` for more details."""