由于平时工作、测试或者实验需要,经常需要计算程序运行时间,其运行环境一般是jupyter或非jupyter环境。本文将对其进行总结,方便下次使用(好记心不如烂笔头嘛)
python中用于计算时间的有time,datetime
(1)其中time包提供了有关时间的方法,与计算当前时间有关的方法有time(), clock(), perf_counter(), process_time(),default_timer()五种方法(严格来说是三种)
(2)datatime中datetime.datetime.now()方法
下面对这些方法一一进行介绍:
(1)time()方法
import time
start = time.time()
time.sleep(2)
end = time.time()
print(end-start)
(2)datetime.now()
start = datetime.datetime.now()
time.sleep(2)
end = datetime.datetime.now()
print(end-start)
(3)default_timer()
import timeit
start=timeit.default_timer()
time.sleep(2)
end=timeit.default_timer()
print('Running time: %s Seconds'%(end-start))
(4)clock()
import time
start = time.clock()
time.sleep(2)
end = time.clock()
print(end-start)
但是会出现警告信息:
5: DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
即该方法在pyhon3.3版本之后就已经弃用了,在python3.8之后将会被移除,也就是说该方法在python3.8以前还可以用,但是不建议用,在python3.8以后再用就会报错了!而pref_counter()和process_time将会将其替代(区别后面介绍)
(5)pref_counter()
import time
start = time.perf_counter()
time.sleep(2)
end = time.perf_counter()
print(end-start)
(6)process_time()
import time
start = time.process_time()
time.sleep(2)
end = time.process_time()
print(end-start)
至于这两种方法区别的话,很简单,perf_count()计算的是程序运行时间,以及sleep()方法时间;而process_time()方法顾名思义,只是计算程序运行时间,不计算sleep()方法。所以,严格来说,pref_counter()才是clock()的替代方法。
jupyter中提供了简洁的统计程序运行时间的方法,包括%%time, %time, %timeit方法
(1)%%time(统计cell块运行时间)
%%time
time.sleep(2)
for i in range(10000):
print(i)
(2)%time(统计语句行运行时间)
%time time.sleep(2)
(3)%timeit(使用Python的timeit模块,它将会执行一个语句100,000次(默认情况下),然后给出运行最快3次的平均值。)
x = 1000
%timeit xx = x*x
输出:
99.7 ns ± 1.22 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
下面将对通用的计算程序运行时间的方法进行总结
1、这些方法各有优缺点,time.time()方法与datetime.datetime.now()方法计算程序运行时间并不准确,因为他们还计算了其他程序占用CPU的时间。
2、而time.clock(),time.perf_counter(),time.process_time()计算比较准确,但是python3.8以后clock()将被perf_counter()方法所取代。
3、系统平台也限制了这些方法统计时间的性能差异,因此,Linux下推荐使用time.time();windows下使用time.perf_counter()或者time().process_time()方法;在为了实现跨平台的精度性时,可以使用timeit.default_timer()方法。
【参考博客】
[1]: https://www.cnblogs.com/yuehouse/p/11493901.html
[2]: https://blog.csdn.net/mxxxkuku/article/details/95784259
[3]: https://blog.csdn.net/qq_27283619/article/details/89280974?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5
[4]: https://blog.csdn.net/zdx1996/article/details/86583676?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-7&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-7