While working on the Woodchuck support in gPodder, I decided to profile the code. Reading the Python manual, I thought it would be as easy as:
import cProfile
cProfile.run('foo()')
On both Debian and Maemo, this results in an import error:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/cProfile.py", line 36, in run
result = prof.print_stats(sort)
File "/usr/lib/python2.6/cProfile.py", line 80, in print_stats
import pstats
ImportError: No module named pstats
To my eyes, this looks like I need to install some package. This is
indeed the case: the python-profiler
package
provides the pstats
module. Unfortunately, python-profiler
is not
free. There's a depressing back story involving ancient
code and missing rights holders.
If you're on Debian, you can just install the python-profiler
package. Alas, the package does not appear to be compiled for Maemo.
Happily, kernprof works around this and is easy to use:
# wget http://packages.python.org/line_profiler/kernprof.py
# python -m kernprof /usr/bin/gpodder
Kernprof saves the statistics in the file program.prof
in the
current directory (in this case, it saves the data in gpodder.prof
).
To analyize the data, you'll need to copy the file to a system that
has python-profiler
installed. Then run:
# python -m pstats gpodder.prof
Welcome to the profile statistics browser.
% sort time
% stats 10
Tue Nov 1 13:09:54 2011 gpodder.prof
105542 function calls (101494 primitive calls) in 117.449 CPU seconds
Ordered by: internal time
List reduced from 1138 to 10 due to restriction <10>
ncalls tottime percall cumtime percall filename:lineno(function)
1 57.458 57.458 69.012 69.012 {exec_}
1 16.052 16.052 26.417 26.417 /usr/lib/python2.5/site-packages/gpodder/qmlui/__init__.py:405(__init__)
1 8.591 8.591 13.790 13.790 /usr/lib/python2.5/site-packages/gpodder/qmlui/__init__.py:24(<module>)
60 7.041 0.117 7.041 0.117 {method 'send_message_with_reply_and_block' of '_dbus_bindings.Connection' objects}
3 6.357 2.119 7.469 2.490 {method 'reset' of 'PySide.QtCore.QAbstractItemModel' objects}
36 2.636 0.073 2.636 0.073 {method 'execute' of 'sqlite3.Cursor' objects}
1 2.283 2.283 2.284 2.284 {method 'setSource' of 'PySide.QtDeclarative.QDeclarativeView' objects}
1 1.848 1.848 1.848 1.848 /usr/lib/python2.5/site-packages/PySide/private.py:1(<module>)
2 1.789 0.895 1.789 0.895 {posix.listdir}
1 0.765 0.765 4.234 4.234 /usr/lib/python2.5/site-packages/gpodder/__init__.py:20(<module>)
The statistics browser is relatively easy to use (at least for the
simple things I've wanted to see so far). Help is available online
using its help
command.