run just tries to exec the string you pass it. If self isn't bound to anything in the scope of the profiler you are using, you can't use it in run! Use the runctx method to pass in the local and global variables in the scope of the call to the profiler:
>>> import time >>> import cProfile as profile >>> class Foo(object): ... def bar(self): ... profile.runctx('self.baz()', globals(), locals()) ... ... def baz(self): ... time.sleep(1) ... print 'slept' ... time.sleep(2) ... >>> foo = Foo() >>> foo.bar() slept 5 function calls in 2.999 CPU seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 2.999 2.999 <stdin>:5(baz) 1 0.000 0.000 2.999 2.999 <string>:1(<module>) 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 2 2.999 1.499 2.999 1.499 {time.sleep}
Notice the last line: time.sleep is what's taking up the time.