在Python中计时函数
我正在尝试在Python中测量两个不同函数的执行时间。
第一个函数:
import cProfile
def bin_search(A, first,last, target):
#returns index of target in A, if present
#returns -1 if target is not present in A
if first > last:
return -1
else:
mid = (first+last)/2
if A[mid]==target:
return mid
elif A[mid]>target:
return bin_search(A,first,mid-1,target)
else:
return bin_search(A,mid+1,last,target)
第二个函数:
def trin_search(A,first,last,target):
#returns index of target in A, if present
#returns -1 if target is not present in A
if target> last or target<first:
return -1
if first>last:
return -1
else:
one_third=first+(last-first)/3
two_thirds=first+2*(last-first)/3
if A[one_third]==target:
return one_third
elif A[one_third]>target:
#search the left-hand third
return trin_search(A,first, one_third,target)
elif A[two_thirds]==target:
return two_thirds
elif A[two_thirds]>target:
#search the middle third
return trin_search(A,one_third+1,two_thirds-1,target)
else:
#search the right-hand third
return trin_search(A,two_thirds+1,last,target)
我想用cprofile.run()这个方法来测量它们的时间。我调用了:
cprofile.run('trin_search(newlist, newlist[0], newlist[-1], 17)')
还有
cprofile.run('bin_search(newlist, newlist[0], newlist[-1], 17)')
第一个函数的结果是:
6 function calls (4 primitive calls) in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :0(setprofile)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
3/1 0.000 0.000 0.000 0.000 Jan 18.py:16(trin_search)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.000 0.000 profile:0(trin_search(newlist, newlist[0], newlist[-1], 17))
第二个函数的结果是:
7 function calls (3 primitive calls) in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
5/1 0.000 0.000 0.000 0.000 Jan 18.py:2(bin_search)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
为什么它们的运行时间显示为0呢?
谢谢,
2 个回答
0
可以试试 timeit 这个模块。它是专门用来测试代码片段运行速度的。
3
正如其他用户提到的,使用 timeit
模块来测量一个带参数的函数的执行时间,下面是一个示例:
import timeit
arg = 10
def foo(arg):
return arg**arg
t=timeit.Timer("foo(arg)","from __main__ import foo, arg")
print t.timeit(5)
请注意,你需要导入你在函数调用中使用的函数和变量。
另外,我建议你使用 IPython,因为它有一些“魔法命令”,你可以简单地输入 %timeit foo(arg)
来测量时间。
对于你的例子,这样做应该没问题:
t=timeit.Timer("bin_search(newlist, newlist[0], newlist[-1], 17)",
"from __main__ import bin_search, newlist")