3

我的大部分 Python 程序都花在了一个名为_build_userdbs. 我正在使用很棒的工具SnakeViz,它有助于解释结果。下面有一个截图。

来自 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()调用该函数?

4

0 回答 0