0. 概要
本文介绍python中利用time module进行运行时间的评估的一些简易方法。
1. time.time()
最简单的莫过于time.time(),如下例所示:
import numpy as np
import time
import timeit
def test_func(N: int):
rng = np.random.default_rng()
a = rng.integers(2*N,size=N)
b = np.sort(a)
# print(b[:100])
# Case 1
tStart = time.time()
test_func(10000000)
tCost = time.time() - tStart
print('tCost = ', tCost, ' (sec)')
test_func()只是一个示例函数(产生一个随机的numpy数组然后进行排序),本文的示例中将一直使用。
在需要评估时间的处理之前调用time.time()记录处理开始时当前时间,然后在处理结束之后再次调用time.time()记录处理结束时的当前时间,两者相减即得处理所消耗的时间。其单位是秒。以上例子运行后的结果如下所示:
tCost = 0.7699501514434814 (sec)
在需要做严肃的长时间的经过时间评估时,time.time()有一个致命的问题,是它不能处理系统时间发生复位的情况。好比说,你用普通的钟进行计时,从第一天下午15:00开始计时,到第二天上午9:00结束,得到的经过时间为-6个小时,这当然是不对的。time.monotonic()可以处理这种情况,参见下一节。
2. time.monotonic()
time.monotonic()的调用方法与time.time()相同,但是它确保了计时的单调性,在系统时钟发生复位时它能自动把这一事件的结果考虑进去。类似于信号处理中的phase unwrap处理。
# Case 2
tStart = time.monotonic()
test_func(10000000)
tCost = time.monotonic() - tStart
print('tCost = ', tCost, ' (sec)')
当然这个例子无法体现time.monotonic()与time.time()的区别。但是,建议在任何需要严肃地进行经过时间评估的场合,都不要使用time.time(),可以用time.monotonic()。
3. time.process_time() and time.perf_counter()
time.process_time() and time.perf_counter()可以用于更高精度的经过时间评估,但是需要两者的差异。
time.process_time()统计的是process-specific processor time,即某一进程在CPU上执行所消耗的时间,而像sleep、等待网络响应、或者其它进程所消耗的时间则不混合统计。
perf_counter()则和前面的time.time()、time.monotonic()一样统计的是所谓Wall-Clock Time,但是比后两者精度高。
通过以下例子可以清楚地看出两者的差异:
# Difference between process_time and perf_counter
print(time.process_time()); time.sleep(10); print(time.process_time())
print(time.perf_counter()); time.sleep(10); print(time.perf_counter())
运行后可以得到。可以看出前后两次process_time()调用的计时值没有体现中间sleep(10)所经过的时间,而前后两次perf_counter()调用的计时值则体现中间sleep(10)所经过的时间。
73.078125
73.078125
4475.7100156
4485.7153613
4. time.strftime() for better formating
可以用函数time.strftime()来对得到的计时值进行格式化使得打印出来的结果更悦目一些。如下所示:
import time
start_time = time.time()
test_func(1000000000)
elapsed_time = time.time() - start_time
print('tCost(H:M:S) = ',time.strftime("%H:%M:%S", time.gmtime(elapsed_time)))
>>>tCost(H:M:S) = 00:02:50
5. datetime
以上time模块中的函数的输出的单位是秒,如果希望得到毫秒单位的结果的话,可以用datetime模块中的函数,如下例所示:
import datetime
start = datetime.datetime.now()
test_func(30000000)
end = datetime.datetime.now()
elapsed = end - start
print('tCost = {0} (sec) : {1} (milisec)'.format( elapsed.seconds,elapsed.microseconds) )
>>> tCost = 2 (sec) : 443479 (milisec)
这里介绍的只是time模块中的一些函数最基本的用法,python中还有很多功能多样的、或者功能更强大的计时或者用于profiling的模块。后面有时间再进一步学习总结,敬请期待。。。
[2021-09-25追加]关于python timeit模块的使用方法示例,请参考:
Python运行时间评估: timeit modulehttps://blog.csdn.net/chenxy_bwave/article/details/120471884