解释cProfile结果:小函数的总时间与累计时间

时间:2015-05-28 22:57:17

标签: python optimization profiling cprofile

我的大多数Python程序都花在一个名为_build_userdbs的方法上。我使用了很棒的工具SnakeViz来帮助解释结果。下面是截图。

Visualization from SnakeViz

现在,在那张照片中,我在_build_userdbs。在其外面的大绿色圆圈是一种名为_append_record的方法,正如您所看到的,它几乎占据了_build_userdbs的所有内容。我理解这一点。

但这是令人困惑的部分。内部绿色圆圈之外的绿色圆圈(占据绝大多数的时间)是_append_record 减去累积时间的累积时间_append_record中调用的函数。

数量上,_append_record的累计时间 55970秒。那是内心的绿色圆圈。它的总时间是54210秒。那是外面的绿色圆圈。

_append_record,正如您所看到的,如果您在新标签中打开该图像,则会调用其他一些功能。那些是:

  • json.dumps()(累积459秒)
  • _userdb_scratch_file_path()(累积161秒)
  • open(累积2160秒)
  • print(小于.1%的框架,因此不显示)

好吧,这是有道理的;由于_append_record累积时间与总时间之间的差异相对较小,因此必须在自己的堆栈帧中进行大量处理,而不是将其委托给其他函数。但这是函数的主体:

def _append_record(self, user, record):
    record = json.dumps(record)
    dest_path = self._userdb_scratch_file_path(user)
    with open(dest_path, 'at') as dest:
        print(record, file=dest)

那么所有这些处理都在哪里进行?此函数调用开销是否会导致差异?分析开销?这些结果是否不准确?为什么不调用close()函数?

0 个答案:

没有答案