Условное профилирование с помощью cProfile
Есть ли способ сделать "условное профилирование" с cProfile
? У меня есть метод, давайте назовем его readPackets()
Предполагается, что это займет не более нескольких миллисекунд, но время от времени это занимает 0,5 секунды или более. (Проблема связана с многопоточным доступом к Python... Я предполагаю, что что-то еще имеет GIL или борется за какую-то блокировку, но я не знаю, что.)
То, что я хочу сделать, это профилировать его только тогда, когда это занимает много времени - я уже могу сделать что-то вроде этого:
pr = cProfile.Profile()
class MyEngine(object):
def run(self):
while self.alive:
# in main event loop
pr.enable()
self.readPackets()
pr.disable()
...
# other stuff
и это дает мне хороший профиль того, что работает внутри readPackets в целом, но эти замедления встречаются довольно редко, и действительно трудно сказать, что происходит в этом единственном экземпляре.
Что я действительно хочу, это что-то вроде этого:
pr = cProfile.Profile()
class MyEngine(object):
def run(self):
while self.alive:
# in main event loop
transaction = pr.beginTransaction()
t0 = time.time()
pr.enable()
self.readPackets()
pr.disable()
t1 = time.time()
if (t1 - t0) > 0.5:
transaction.commit() # Found a slow execution!
else:
transaction.rollback() # it's fast, ignore it
...
# other stuff
или это:
class MyEngine(object):
def run(self):
while self.alive:
# in main event loop
t0 = time.time()
pr.enable()
self.readPackets()
pr.disable()
t1 = time.time()
if (t1 - t0) < 0.5:
pr.clear() # get rid of this iteration, we don't care
else:
sys.exit() # got a slow iteration ...
# other stuff
Есть ли способ профилировать один вызов метода, но сохранить результаты, только если он медленный?