[Python-ideas] Allow Profile() to be used as a context manager
David Townshend
aquavitae69 at gmail.com
Wed Jan 25 13:18:03 CET 2012
shameless-advertisement noted! It looks like a useful tool, but I had
something rather simpler in mind, and something included in the stdlib. I
think adding a decorator too is a good idea, but as pointed out there is
already a patch for this.
David
On Wed, Jan 25, 2012 at 1:37 PM, Robert Kern <robert.kern at gmail.com> wrote:
> On 1/25/12 8:19 AM, Yuval Greenfield wrote:
>
>> On Wed, Jan 25, 2012 at 8:36 AM, David Townshend
>> <aquavitae69 at gmail.com
>> <mailto:aquavitae69 at gmail.com>**> wrote:
>>
>> [...]
>> Any major objections to this?
>>
>>
>>
>> At first this sounded like a good idea but 2 things pop to mind:
>>
>> 1. How does one get the pstat profiling output from the context manager?
>> Will
>>
>> printing out the results be the only option?
>> 2. Usually when I profile I don't want to touch the code at all so
>> eventually
>>
>> if I'll use this context manager it'll be more akin to
>>
>>
>> with profile.Profiler():
>> main()
>>
>> Which isn't much of a win over
>>
>> profile.run('main()')
>>
>>
>> Now if you're talking about a reentrant profiler, that's interesting:
>>
>> profiler = profile.Profiler()
>>
>> while is_working:
>> with profiler:
>> do_hard_task()
>> do_a_hard_but_i_dont_care_now_**task()
>>
>> with profiler:
>> do_a_diff_hard_task()
>>
>>
>> and then I can call whatever method is there to get the pstat. If this is
>> the
>> vision then it sounds awesome.
>>
>
> <shameless-advertisement>
>
> You may want to take a look at my kernprof script mentioned elsewhere in
> the thread:
>
> http://packages.python.org/**line_profiler/<http://packages.python.org/line_profiler/>
> http://pypi.python.org/pypi/**line_profiler/<http://pypi.python.org/pypi/line_profiler/>
>
> Besides adding the context manager to Profile, it is a generic "runner"
> script that will run your script under the profiler and dump the results to
> a file. In the normal use case of profiling the entire script, you don't
> have to modify your code at all:
>
> [line_profiler]$ kernprof.py -v pystone.py
> Pystone(1.1) time for 50000 passes = 0.918603
> This machine benchmarks at 54430.5 pystones/second
> Wrote profile results to pystone.py.prof
> 1100070 function calls in 0.929 seconds
>
> Ordered by: standard name
>
> ncalls tottime percall cumtime percall filename:lineno(function)
> 1 0.000 0.000 0.929 0.929 <string>:1(<module>)
> 50000 0.140 0.000 0.322 0.000 pystone.py:137(Proc1)
> 50000 0.029 0.000 0.029 0.000 pystone.py:153(Proc2)
> 50000 0.036 0.000 0.048 0.000 pystone.py:164(Proc3)
> 50000 0.015 0.000 0.015 0.000 pystone.py:174(Proc4)
> 50000 0.013 0.000 0.013 0.000 pystone.py:181(Proc5)
> 50000 0.033 0.000 0.043 0.000 pystone.py:188(Proc6)
> 150000 0.034 0.000 0.034 0.000 pystone.py:207(Proc7)
> 50000 0.100 0.000 0.126 0.000 pystone.py:212(Proc8)
> 150000 0.035 0.000 0.035 0.000 pystone.py:225(Func1)
> ...
>
> But if you do want to use the context manager or the decorator, then there
> is a flag to the script that injects the Profile instance into the
> builtins. Then you can use "@profile" or "with profile:" to only enable the
> profiler at certain points (and multiple points as in your use case above).
> These are the only modifications you need to make. The stats dumping is
> handled by kernprof.
>
> [line_profiler]$ grin -A10 '@profile' pystone.py
> pystone.py:
> 164 : @profile
> 165 + def Proc3(PtrParOut):
> 166 + global IntGlob
> 167 +
> 168 + if PtrGlb is not None:
> 169 + PtrParOut = PtrGlb.PtrComp
> 170 + else:
> 171 + IntGlob = 100
> 172 + PtrGlb.IntComp = Proc7(10, IntGlob)
> 173 + return PtrParOut
> 174 +
> 182 : @profile
> 183 + def Proc5():
> 184 + global Char1Glob
> 185 + global BoolGlob
> 186 +
> 187 + Char1Glob = 'A'
> 188 + BoolGlob = FALSE
> 189 +
> 190 + def Proc6(EnumParIn):
> 191 + EnumParOut = EnumParIn
> 192 + if not Func3(EnumParIn):
>
> [line_profiler]$ kernprof.py -v --builtin pystone.py
> Pystone(1.1) time for 50000 passes = 1.08921
> This machine benchmarks at 45904.8 pystones/second
> Wrote profile results to pystone.py.prof
> 350000 function calls in 0.192 seconds
>
> Ordered by: standard name
>
> ncalls tottime percall cumtime percall filename:lineno(function)
> 100000 0.116 0.000 0.123 0.000 kernprof.py:73(disable_by_*
> *count)
> 50000 0.042 0.000 0.055 0.000 pystone.py:164(Proc3)
> 50000 0.013 0.000 0.013 0.000 pystone.py:182(Proc5)
> 50000 0.013 0.000 0.013 0.000 pystone.py:209(Proc7)
> 100000 0.007 0.000 0.007 0.000 {method 'disable' of
> '_lsprof.Profiler' objects}
>
> </shameless-advertisement>
>
>
> --
> Robert Kern
>
> "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
>
> ______________________________**_________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/**mailman/listinfo/python-ideas<http://mail.python.org/mailman/listinfo/python-ideas>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20120125/a5e03245/attachment.html>
More information about the Python-ideas
mailing list