Python运行时间评估: time module

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 moduleicon-default.png?t=L892https://blog.csdn.net/chenxy_bwave/article/details/120471884

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨牛慢耕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值