# Module Cyclops version 0.9.4.
# Released to the public domain 18-Jul-1999,
# by Tim Peters (tim_one@email.msn.com).

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.
