Python时间测试:time()、perf_counter()和process_time()的区别
介绍时间函数 time()、perf_counter()和process_time(),以及`timeit`
1. time.time()方法
返回自纪元以来的 秒数 作为浮点数,但是时期的具体日期和闰秒的处理取决于使用的平台。比如:在Windows和大多数Unix系统上,纪元是1970年1月1日00:00:00(UTC),并且闰秒不计入自纪元以来的秒数,这也通常被称为Unix时间。我们要可以通过gmtime(0)查看自己平台上的纪元。
注意,即使时间总是作为浮点数返回,但并非所有系统都提供的精度高于1秒,而且更改系统的时间会影响time()的值。 虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值。
time()返回的数字可以转换为更常见的时间格式(即年,月,日,小时等),方法是将其传递给gmtime()函数或在本地时间传递给本地时间( )功能。在这两种情况下都返回struct_time对象,可以从该对象作为属性访问日历日期的组件。
所以我们通常用time()来做时间的格式输出,也会用在一些测试代码时间上面。在我们测试代码的时候需要调用两次,做差值,注意它会把sleep()的时间也算进去。
2. time.perf_counter()方法
返回性能计数器的值(以小数 秒 为单位)作为浮点数,即具有最高可用分辨率的时钟,以测量短持续时间。 它确实包括睡眠期间经过的时间,并且是系统范围的。
通常perf_counter()用在测试代码时间上,具有最高的可用分辨率。不过因为返回值的参考点未定义,因此我们测试代码的时候需要调用两次,做差值。
perf_counter()会包含sleep()休眠时间,适用测量短持续时间
3. time.process_time()方法
返回当前进程的系统和用户CPU时间总和的值(以小数 秒 为单位)作为浮点数。
通常time.process_time()也用在测试代码时间上,根据定义,它在整个过程中。返回值的参考点未定义,因此我们测试代码的时候需要调用两次,做差值。
注意 process_time()不包括sleep()休眠时间 期间经过的时间。
4. 三者比较
-
除了time模块,Python还提供了
timeit
模块。timeit模块提供了一种简单的方法来计算一小段Python代码,比如一些循环或者正则匹配。 timeit既有命令行界面,也有可调用界面。 避免了许多用于测量执行时间的常见陷阱。可以用于基准测试/分析目的的代码块。具体的用法:更多用法可以查看 timeit官方文档import timeit t = timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) print(t)
-
time()精度上相对没有那么高,而且受系统的影响,适合表示日期时间或者大程序程序的计时。
-
perf_counter()适合小一点的程序测试,会计算sleep()时间
-
process_counter()适合小一点的程序测试,不会计算sleep()时间。
ns计时
此外Python3.7开始还提供了以上三个方法精确到纳秒的计时。分别是:
- time.perf_counter_ns()
- time.process_time_ns()
- time.time_ns()
注意这三个精确到纳秒的方法返回的是整数类型。以前还有一个clock()方法,尽管现在这个方法还能用,但是这个方法在Python3.8中会被废除掉了,所以这里就不过多介绍。
5 示例代码与结果
示例代码:
import time
def task(): # 预期休眠 10 s
for i in range(1000):
time.sleep(0.01) # sleep for 10 ms per epoch
def main():
t1 = time.time()
task()
t1 = time.time() - t1
t2 = time.perf_counter()
task()
t2 = time.perf_counter() - t2
t3 = time.process_time()
task()
t3 = time.process_time() - t3
print(f"time()方法用时:{t1} s") # 测量休眠时间
print(f"perf_counter()用时:{t2} s") # 测量休眠时间
print(f"process_time()用时:{t3} s") # 不计休眠时间
print("Done.")
if __name__ == '__main__':
main()
输出:
time()方法用时:15.778308153152466 s
perf_counter()用时:15.869407600000002 s
process_time()用时:0.015625 s
Done.
分析:
process_time() 不计休眠时间,但是函数调用也有时间,如果直接测试task的函数体,process_time()用时 0 秒。
6 写在最后
最后附上Python3.7time模块的官方文档和源码地址:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)