Python3.7中time模块的time()、perf_counter()和process_time()的区别

Python3.7中time模块的time方法、perf_counter方法和process_time方法的区别

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. 三者比较

  1. 除了time模块,Python还提供了timeit模块。timeit模块提供了一种简单的方法来计算一小段Python代码,比如一些循环或者正则匹配。 timeit既有命令行界面,也有可调用界面。 避免了许多用于测量执行时间的常见陷阱。可以用于基准测试/分析目的的代码块。
    具体的用法:更多用法可以查看timeit官方文档
import timeit
t = timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
print(t)
  1. time()精度上相对没有那么高,而且受系统的影响,适合表示日期时间或者大程序程序的计时。
  2. perf_counter()适合小一点的程序测试,会计算sleep()时间
  3. process_counter()适合小一点的程序测试,不会计算sleep()时间
    此外Python3.7开始还提供了以上三个方法精确到纳秒的计时。分别是:
    time.perf_counter_ns()
    time.process_time_ns()
    time.time_ns()
    注意这三个精确到纳秒的方法返回的是整数类型。
  4. 以前还有一个clock()方法,尽管现在这个方法还能用,但是这个方法在Python3.8中会被废除掉了,所以这里就不过多介绍。

5 测试代码

import time

print('我是time()方法:{}'.format(time.time()))
print('我是perf_counter()方法:{}'.format(time.perf_counter()))
print('我是process_time()方法:{}'.format(time.process_time()))
t0 = time.time()
c0 = time.perf_counter()
p0 = time.process_time()
r = 0
for i in range(10000000):
    r += i
time.sleep(2)
print(r)
t1 = time.time()
c1 = time.perf_counter()
p1 = time.process_time()
spend1 = t1 - t0
spend2 = c1 - c0
spend3 = p1 - p0
print("time()方法用时:{}s".format(spend1))
print("perf_counter()用时:{}s".format(spend2))
print("process_time()用时:{}s".format(spend3))
print("测试完毕")

6 写在最后

因为博主目前技术水平和接触有限,看了部分源代码,也还是有很多地方还不是很明白,文中有说的不对,或者小伙伴们谁比较清楚的,欢迎留言交流。
最后附上Python3.7time模块的官方文档和源码地址:
time模块官方文档
time模块的源代码

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技,扫描下方二维码或者搜索每日学一技关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!
每日学一技

  • 136
    点赞
  • 323
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
time.perf_counter()和time.time()是两个用于测量时间的方法,它们之间存在一些区别time.perf_counter()返回性能计数器的值,以小数秒为单位,具有最高可用分辨率的时钟,用于测量短持续时间。它包括了睡眠期间经过的时间,并且是系统范围的。通常在测试代码时间上使用perf_counter(),因为它具有最高的可用分辨率。需要注意的是,perf_counter()的参考点未定义,因此在测试代码时间时需要调用两次,并且计算两次调用之间的差值,以获得准确的时间间隔。 而time.time()返回自纪元以来的秒数作为浮点数,具体日期和闰秒的处理取决于使用的平台。它通常用于时间的格式化输出,可以将返回的数字转换为更常见的时间格式,如年、月、日、小时等。需要注意的是,不是所有系统都提供比1秒更高的精度,并且更改系统时间会影响time()的值。此外,time()的返回值是递增的,但如果在两次调用之间设置了系统时钟,则可能会返回比先前调用更低的值。 综上所述,time.perf_counter()适用于测量短持续时间,具有最高的分辨率,而time.time()用于获取当前时间和时间格式化输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python3.7time模块time()、perf_counter()和process_time()的区别](https://blog.csdn.net/qq_27283619/article/details/89280974)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值