[Python-ideas] Allow Profile() to be used as a context manager
robert.kern at gmail.com
Wed Jan 25 11:16:58 CET 2012
On 1/25/12 6:36 AM, David Townshend wrote:
> I often find it useful to profile small sections to code in a running
> application to pinpoint a known bottleneck. The cProfile and profile modules
> don't make this easy as they stand, requiring the section of code to be wrapped
> into a single statement with can be called as a string using exec(). This
> always feels a bit clumsy to me, so my idea is simply to provide __enter__ and
> __exit__ methods to cProfile.Profile() and profile.Profile(). From a quick look
> at the code it seems that this should be very easy for cProfile, and slightly
> less easy for profile (I can't quite figure out how to deal with the set_cmd()
> line, or how important it is - maybe someone can help?).
> Any major objections to this?
I've done this in my kernprof.py script, which I use as a convenient generic
profiling script. I subclass cProfile.Profile to add
enable_by_count()/disable_by_count() methods that allow nesting.
enable_by_count() increments a counter and only calls the enable() method the
first time. disable_by_count() decrements the counter and only calls disable()
when it hits 0 again. __enter__() and __exit__() just call these methods. I also
add a __call__() method that lets a Profile instance act as a decorator, which I
actually find somewhat more useful than the context manager.
"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
More information about the Python-ideas