这是我的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
的输出应该更大或至少接近线轮廓仪。我是否错误地解释了结果?线轮廓仪是否将自己的时间添加到"总时间"?
答案 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