# Module Cyclops version 0.9.4.
# Released to the public domain 18-Jul-1999,
# by Tim Peters ([email protected]).

Cyclops.py implements a CycleTracker class that provides major help in
finding and analyzing runtime cycles in Python programs.

Strong points:

+ Much faster than previous similar modules.  Searching for cycles
 takes time linear in the number of objects reachable from the
 registered objects plus the number of arcs connecting them, and all
 computation needed to display cycles is delayed until it's really
 needed (if ever). Tens of thousands of objects and hundreds of
 thousands of arcs can be analyzed in less than a minute on my creaky
 old P5-166 system.

+ Many kinds of optional output reports, from a simple listing of
 objects found in cycles, to a partitioning of cyclic objects into
 maximal strongly-connected components.

+ Easy to add new types to the set of objects CycleTracker knows how
 to "chase":  pass appropriate functions to a CycleTracker instance's
 chase_type() method.  It's done this way instead of via subclassing
 for speed.

+ An optional cycle-filter callback can be registered to ignore expected
 cycles (typically those created by the Python implementation itself).

Weak points:

+ The problems this module helps to address are inherently difficult, and
 CycleTracker doesn't make them any easier to understand or to fix -- it
 only helps identify what and where they are.  It's a tool, not a
 solution.

+ All the optional abilities make for a steep learning curve.

+ Registering objects can distort the behavior of the program under
 investigation, by keeping objects alive that would otherwise have died.
 See the module docstring for discussion and workarounds.