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

2024-06-01 22:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我的大部分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(少于帧的0.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()函数?在


Tags: path方法函数buildjson时间recordfile