计算一个代码跑多久
1,time()
import time
start = time.time()
xxx
xxx
end = time.time()
running_time = end-start
print('time cost : %.5f sec' %running_time)
输出时间默认为秒(对于时间太短可能无法很精确)
举例:
计算两个数/数组相加的时间
import time
def display_time(func):
def wrapper(*args):
t1 = time.time()
print('answer = %.2f'%func(*args))
t2 = time.time()
print('time cost: %.6f'%(t2-t1))
return wrapper
@display_time #使用装饰器的方法
def sum_(a,b):
return (a+b)
sum_(10,20)
>>>answer = 30.00
>>>time cost: 0.004945
上面使用装饰器的方法可以参加笔者python教程第一部分12节
2.timeit()
1,python中文timeit
2,python 英文timeit
这里先看例题再看解析:
Timer()
from timeit import Timer #导入Timer
def sum_(a,b):
return (a+b)
‘’‘计算a+b的和画的时间,计算1000的总时间’‘’
t1 = Timer("sum_(10,20)","from __main__ import sum_")
print("time cost %.5f seconds\n"%t1.timeit(number=1000))
注意,上面是计算1000次的总时间,不是平均时间
上面的核心是:
t1 = Timer("sum_(10,20)","from __main__ import sum_")
class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)
Timer()函数第一个参数是statement(声明),必须是str类型,第二个参数是setup(安装),所以上面的含义是,计算sum_(10,20)即10+20的和,其中sum_函数从__main__中导入,需要注意的是,main()函数就是我们当前的程序。
再举个例子:
import timeit
x = list(range(20000))#[0,1,2,3...19999]
#使用pop函数去除列表的第一个数
popzero = timeit.Timer("x.pop(0)","from __main__ import x")
#计算1000次花的时间
print(popzero.timeit(number=1000))
#使用pop去除最后一个数
popend = timeit.Timer("x.pop()","from __main__ import x")
print(popend.timeit(number=1000))
>>>0.012933371937833726
>>>0.00024989701341837645
上面的方法是用来计算pop()和pop(i)(i表示第i个数)的运行时间的
从时间复杂度而言,pop(i)是O(n),是pop()始终是O(1).所以pop(i)的时间要长一些。
————————以下为原文————————
timeit有两种用法,
用法1:在命令行上运行
在命令行上运行1+1,并计算时间。
上面-m不可少,表示在命令行将library module库像脚本一样运行,即在命令行运行程序。
上面100000000 loops表示运行了1亿次1+1,而best of 3表示调用了三次timeit()函数,每调用一次timeit()都运行1亿次循环。通过调用三次,其中最好的一次(时间最小)是每次循环花了0.00788 usec(微秒),所以总时间是:
1
亿
×
0.00788
×
1
0
−
6
秒
=
7.8
秒
1亿\times 0.00788\times 10^{-6} 秒=7.8秒
1亿×0.00788×10−6秒=7.8秒
这个运行多少loops在命令行上是不确定的,系统自己根据运行来执行,一般而言,运行时间越小,loops次数越多。另外这个7.8秒实际上并不需要算出来,因为我们只看一次运行的时间,所以1+1运行花了0.00788微秒。
但是我们可以自己来给定运行的loops次数,
这里用到的-n 等命令如下:
-s表示开始只执行一次,在下面会说到
用法2:在程序块中运行
强烈建议看这篇博文,写的很细 https://www.cnblogs.com/hengyumo/p/10617018.html
如果只想粗略知道如何用,看我写的即可
from timeit import timeit
print(timeit('1+1',number=1000))
上面代码等价于
from timeit import timeit
x='''
1+1
'''
print(timeit(stmt=x,number=1000))
stmt表示statement,放入需要执行的表达式,多个表达式用;分开
这个时间算的是1000次执行的时间,单位的计算见下文
假如把number=去掉,
from timeit import timeit
x='''
1+1
'''
print(timeit(stmt=x))
时间反而变长了,这是因为默认number
=
1
0
6
=10^6
=106,即计算了10的6次方次,总的时间。
单位问题:
假如计算的时候写number=1,即表示计算的是一次,输出的也是一次计算的时间,单位是秒。当不写number的时候,默认number是等于 1 0 6 10^6 106,即计算了10的6次方次的总时间,所以单位是微秒
from timeit import timeit
import time
s=time.time()
x=[i**2 for i in range(10000)]
e=time.time()
print('%.8f'%(e-s))
print(timeit('x=[i**2 for i in range(10000)]',number=1))
上面写了number=1,所以单位都是秒
from timeit import timeit
import time
s=time.time()
x=[i**2 for i in range(10000)]
e=time.time()
print('%.8f'%(e-s))
print(timeit('x=[i**2 for i in range(10000)]'))
不写number,单位是微秒,(这个时候因为要计算1000000次,所以很慢)
可能会经常看到博文用%timeit xxx的用法,这个是在ipython里直接用的,不需要像python里面需要import timeit
%在ipython里叫做line magic魔法行命令,%%为cell magic魔法单元命令