我的大部分 Python 程序都花在了一个名为_build_userdbs
. 我正在使用很棒的工具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()
调用该函数?