Время Python, профилирующее каждое утверждение как функцию параметров - PullRequest
0 голосов
/ 08 мая 2018

Я хочу рассчитать профиль кода Python как функцию от 2 параметров. Например,

param1 = 1
param2 = 2

# code goes here
# stmt 1
# stmt 2
# ...
# end

Я хочу построить время как функцию параметров для каждого оператора в коде. Я могу придумать подход грубой силы для поддержки базы данных для хранения этих значений. Существуют ли зрелые библиотеки Python, которые делают это автоматически?

1 Ответ

0 голосов
/ 09 мая 2018

Я закончил тем, что создал 2 класса для своей цели:

import time
class Timer(object):
  def __init__(self, times = None):
    """ times is a dictionary of key:int or list
     """
    self.times = times

  def start(self, key):
    if type(self.times[key]) == list:
        self.times[key].append(time.time())
    else:
        self.times[key] = time.time()

  def stop(self, key):
    if type(self.times[key]) == list:
        self.times[key][-1] = time.time() - self.times[key][-1]
    else:
        self.times[key] = time.time() - self.times[key]

from collections import defaultdict
class TimeProfiler(object):
  def __init__(self, msg):
    """ msg is to distinguish between different profilers"""
    self.msg = msg
    self.times = defaultdict(list)

  def append(self, attr, timer):
    self.times['ATTR'].append(attr)
    for key, value in timer.times.iteritems():
        self.times[key].append(value)

  def plot(self, key):
    if type(self.times[key][0]) == list:
        y = [x[0] for x in self.times[key]]
    else:
        y = self.times[key]
    # use your favorite potting library

  def make_key(self, final_key, base_keys= []):
    # combine several keys
    self.times[final_key] = [sum(i) for i in zip((self.times[x] for x in base_keys))]

Чтобы использовать два выше:

 time_profiler = TimeProfiler("experiment1")
 for attr in range(10):
   timer = Timer({'stmt1':0, 'stmt2':0})
   timer.start('stmt1');
   #stmt1
   timer.stop('stmt1'); timer.start('stmt2');
   #stmt2
   timer.stop('stmt2');
   time_profiler.append(attr, timer)

 time_profiler.plot(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...