python的line profiler总时间很奇怪

时间:2015-09-11 04:36:05

标签: python sorting profiling

这是我的insertion.py:

import random

#@profile
def insertion_sort(l):
    for j in range(1, len(l)):
        k = l[j]
        i = j - 1
        while i >= 0 and l[i] > k:
            l[i + 1] = l[i]
            i -= 1
        l[i + 1] = k


if __name__ == '__main__':
    l = range(5000)
    random.shuffle(l)
    insertion_sort(l)

当我运行time python insertion.py时,我得到:

real    0m0.823s
user    0m0.818s
sys     0m0.004s

但是当我取消注释配置文件装饰器并运行:kernprof -l -v insertion.py时,我得到:

Wrote profile results to insertion.py.lprof
Timer unit: 1e-06 s

Total time: 7.25971 s
File: insertion.py
Function: insertion_sort at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
 4                                           @profile
 5                                           def insertion_sort(l):
 6      5000         2110      0.4      0.0      for j in range(1, len(l)):
 7      4999         1929      0.4      0.0          k = l[j]
 8      4999         1719      0.3      0.0          i = j - 1
 9   6211255      2695158      0.4     37.1          while i >= 0 and l[i] > k:
10   6206256      2396675      0.4     33.0              l[i + 1] = l[i] 
11   6206256      2160158      0.3     29.8              i -= 1
12      4999         1959      0.4      0.0          l[i + 1] = k

我的问题是为什么线路探测器的总时间远远大于系统时间?我想"总时间" line profiler描述了@profile运行的函数运行的时间。在我的脑海中,time的输出应该更大或至少接近线轮廓仪。我是否错误地解释了结果?线轮廓仪是否将自己的时间添加到"总时间"?

1 个答案:

答案 0 :(得分:2)

我的结果显示ContextualProfile在这种情况下几乎没有增加任何开销,但LineProfiler会增加非常大的开销。

这并不奇怪,因为// Set the name of the list_ String listName = "newList"; // Create the list of PrivacyItem that will allow or deny some privacy aspect_ String user = "tybalt@example.com"; String groupName = "enemies"; ArrayList privacyItems = new ArrayList(); PrivacyItem item = new PrivacyItem(PrivacyItem.Type.jid, user, true, 1); privacyItems.add(item); item = new PrivacyItem(PrivacyItem.Type.subscription, PrivacyItem.SUBSCRIPTION_BOTH, true, 2); privacyItems.add(item); item = new PrivacyItem(PrivacyItem.Type.group, groupName, false, 3); item.setFilterMessage(true); privacyItems.add(item); // Get the privacy manager for the current connection._ PrivacyListManager privacyManager = PrivacyListManager.getInstanceFor(myConnection); // Create the new list._ privacyManager.createPrivacyList(listName, privacyItems); a bunch of code执行every line。因此,以前简单分配或简单比较的行现在包括几个比较,函数调用和数据结构。

在我的结果中,LineProfiler开销可估计为每行527到615纳秒之间,通过将总时间(11.2287秒)除以命中数(5000 + 4999 + 4999 + 6081512 +)计算得出6076513 + 6076513 + 4999 =18254535≅18M),然后减去另一个探查器的总时间除以相同的命中数。同样,这只是对开销的粗略估计。

完整输出如下:

LineProfiler