Условное профилирование с помощью 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

Есть ли способ профилировать один вызов метода, но сохранить результаты, только если он медленный?

0 ответов

Другие вопросы по тегам