Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python profiler usage with objects

I have a specific question regarding the usage of profiler. I am new to python programming I am trying to profile a function which I want to invoke as a class method, something like this

import profile

class Class:
    def doSomething():
        do here ..

    def callMethod():
        self.doSomething()

instead of this I want to use

    profile.run(self.doSomething())

but the profile.run expects the string inside it and I get error

TypeError: exec: arg 1 must be a string, file, or code object

Can somebody please help?

Thank you

like image 702
daydreamer Avatar asked Jun 29 '10 16:06

daydreamer


2 Answers

Fixed!!!

Instead of profile, I used cProfile module that as per the python docs has much lesser overhead

Ref : http://docs.python.org/library/profile.html#introduction-to-the-profilers

with cProfiler, one can actually pass the local and global params using the runctx module so for the same problem, I did the following:

import cProfile
cProfile.runctx('self.doSomething()',globals(),locals())

and it worked :)

also, if you have more params to pass you can like

import cProfile
cProfile.runctx('self.doSomething(x,y,z)',globals(),locals())

Thanks for all help

like image 103
daydreamer Avatar answered Sep 23 '22 09:09

daydreamer


You need to fix various imprecisions (missing self, saying you're using class methods when there's no classmethod in sight, failing to inherit from object, ...) then make profile happy by giving it a string as it wants -- and the name of the instance must be made globally visible so that profile can actually use that string. For example:

import profile
import time

class Class(object):

  def doSomething(self):
      time.sleep(0.1)

  def callMethod(self):
      global _o
      _o = self
      profile.run('_o.doSomething()')

o = Class()
o.callMethod()
like image 25
Alex Martelli Avatar answered Sep 23 '22 09:09

Alex Martelli