# 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.