百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

python系列(time时钟时间)(python中time.time)

bigegpt 2024-08-03 11:41 6 浏览

该time模块提供对几种不同类型时钟的访问,每种时钟都可用于不同目的。标准系统调用time()报告系统“挂钟”时间。该 monotonic()时钟可以用来衡量一个长期运行的进程经过的时间,因为它保证永远不会被向后移动,即使系统时间被改变。对于性能测试, perf_counter()提供对具有最高可用分辨率的时钟的访问,以使短时间测量更准确。CPU时间可通过clock(),并 process_time()返回组合的处理器时间和系统时间。

注意

这些实现公开了C库函数来操作日期和时间。由于它们与底层C实现相关联,因此某些细节(例如,纪元的开始和支持的最大日期值)是特定于平台的。有关完整的详细信息,请参阅库文档。

比较时钟

时钟的实现细节因平台而异。使用 get_clock_info()访问了解,目前实现的基本信息,包括时钟的分辨率。

time_get_clock_info.py

import textwrap
import time
available_clocks = [
 ('clock', time.clock),
 ('monotonic', time.monotonic),
 ('perf_counter', time.perf_counter),
 ('process_time', time.process_time),
 ('time', time.time),
]
for clock_name, func in available_clocks:
 print(textwrap.dedent('''\
 {name}:
 adjustable : {info.adjustable}
 implementation: {info.implementation}
 monotonic : {info.monotonic}
 resolution : {info.resolution}
 current : {current}
 ''').format(
 name=clock_name,
 info=time.get_clock_info(clock_name),
 current=func())
 )

Mac OS X的此输出显示单调和perf_counter时钟使用相同的底层系统调用实现。

$ python3 time_get_clock_info.py
clock:
 adjustable : False
 implementation: clock()
 monotonic : True
 resolution : 1e-06
 current : 0.046796
monotonic:
 adjustable : False
 implementation: mach_absolute_time()
 monotonic : True
 resolution : 1e-09
 current : 716028.526210432
perf_counter:
 adjustable : False
 implementation: mach_absolute_time()
 monotonic : True
 resolution : 1e-09
 current : 716028.526241605
process_time:
 adjustable : False
 implementation: getrusage(RUSAGE_SELF)
 monotonic : True
 resolution : 1e-06
 current : 0.046946999999999996
time:
 adjustable : True
 implementation: gettimeofday()
 monotonic : False
 resolution : 1e-06
 current : 1521404584.966362

挂钟时间

该time模块的核心功能之一是time(),它将“epoch”开始后的秒数作为浮点值返回。

time_time.py

import time
print('The time is:', time.time())

时代是时间测量的开始,对于Unix系统来说,它是1970年1月1日的0:00。虽然值总是浮点数,但实际精度与平台有关。

$ python3 time_time.py
The time is: 1521404585.0243158

浮点表示在存储或比较日期时很有用,但对生成人类可读表示没有用。对于记录或打印时间ctime()可能更有用。

time_ctime.py

import time
print('The time is :', time.ctime())
later = time.time() + 15
print('15 secs from now :', time.ctime(later))

print()此示例中的第二个调用显示如何使用 ctime()格式化当前时间以外的时间值。

$ python3 time_ctime.py
The time is : Sun Mar 18 16:23:05 2018
15 secs from now : Sun Mar 18 16:23:20 2018

单调时钟

由于time()查看系统时钟,并且用户或系统服务可以更改系统时钟以在多台计算机之间同步时钟,因此time()重复调用可能会生成前后转换的值。当尝试测量持续时间或以其他方式使用这些时间进行计算时,这可能导致意外行为。通过使用避免这些情况monotonic(),它总是返回前进的值。

time_monotonic.py

import time
start = time.monotonic()
time.sleep(0.1)
end = time.monotonic()
print('start : {:>9.2f}'.format(start))
print('end : {:>9.2f}'.format(end))
print('span : {:>9.2f}'.format(end - start))

未定义单调时钟的起始点,因此返回值仅对使用其他时钟值进行计算有用。在该示例中,使用以下来测量睡眠的持续时间 monotonic()。

$ python3 time_monotonic.py
start : 716028.72
end : 716028.82
span : 0.10

处理器时钟时间

而time()返回一个挂钟时间,clock()返回处理器时钟时间。返回的值clock()反映了程序运行时使用的实际时间。

time_clock.py

import hashlib
import time
# Data to use to calculate md5 checksums
data = open(__file__, 'rb').read()
for i in range(5):
 h = hashlib.sha1()
 print(time.ctime(), ': {:0.3f} {:0.3f}'.format(
 time.time(), time.clock()))
 for i in range(300000):
 h.update(data)
 cksum = h.digest()

在此示例中,格式化ctime()与浮点值一起打印time(),并且clock()对于循环中的每次迭代打印。

注意

如果要在系统上运行该示例,则可能必须向内部循环添加更多循环,或者使用更大量的数据来实际查看时间差异。

$ python3 time_clock.py
Sun Mar 18 16:23:05 2018 : 1521404585.328 0.051
Sun Mar 18 16:23:05 2018 : 1521404585.632 0.349
Sun Mar 18 16:23:05 2018 : 1521404585.935 0.648
Sun Mar 18 16:23:06 2018 : 1521404586.234 0.943
Sun Mar 18 16:23:06 2018 : 1521404586.539 1.244

通常,如果程序没有执行任何操作,则处理器时钟不会打勾。

time_clock_sleep.py

import time
template = '{} - {:0.2f} - {:0.2f}'
print(template.format(
 time.ctime(), time.time(), time.clock())
)
for i in range(3, 0, -1):
 print('Sleeping', i)
 time.sleep(i)
 print(template.format(
 time.ctime(), time.time(), time.clock())
 )

在这个例子中,循环通过在每次迭代后进入休眠状态来完成很少的工作。time()即使应用程序处于睡眠状态,该值也会增加,但clock()值不会。

$ python3 -u time_clock_sleep.py
Sun Mar 18 16:23:06 2018 - 1521404586.89 - 0.04
Sleeping 3
Sun Mar 18 16:23:09 2018 - 1521404589.90 - 0.04
Sleeping 2
Sun Mar 18 16:23:11 2018 - 1521404591.90 - 0.04
Sleeping 1
Sun Mar 18 16:23:12 2018 - 1521404592.90 - 0.04

sleep()从当前线程调用yield控制并要求它等待系统将其唤醒。如果一个程序只有一个线程,这有效地阻止了应用程序,它不起作用。

性能计数器

重要的是具有用于测量性能的高分辨率单调时钟。确定最佳时钟数据源需要Python提供的特定于平台的知识 perf_counter()。

time_perf_counter.py

import hashlib
import time
# Data to use to calculate md5 checksums
data = open(__file__, 'rb').read()
loop_start = time.perf_counter()
for i in range(5):
 iter_start = time.perf_counter()
 h = hashlib.sha1()
 for i in range(300000):
 h.update(data)
 cksum = h.digest()
 now = time.perf_counter()
 loop_elapsed = now - loop_start
 iter_elapsed = now - iter_start
 print(time.ctime(), ': {:0.3f} {:0.3f}'.format(
 iter_elapsed, loop_elapsed))

与此同时monotonic(),perf_counter()时间段未定义,并且值旨在用于比较和计算值,而不是绝对时间。

$ python3 time_perf_counter.py
Sun Mar 18 16:23:13 2018 : 0.378 0.378
Sun Mar 18 16:23:13 2018 : 0.376 0.754
Sun Mar 18 16:23:14 2018 : 0.372 1.126
Sun Mar 18 16:23:14 2018 : 0.376 1.502
Sun Mar 18 16:23:14 2018 : 0.376 1.879

时间成分

将时间存储为经过的秒数在某些情况下很有用,但有时程序需要访问日期(年,月等)的各个字段。该time模块定义 struct_time了保存日期和时间值,其中组件已分解,因此易于访问。有几个函数可以使用struct_time值而不是浮点数。

time_struct.py

import time
def show_struct(s):
 print(' tm_year :', s.tm_year)
 print(' tm_mon :', s.tm_mon)
 print(' tm_mday :', s.tm_mday)
 print(' tm_hour :', s.tm_hour)
 print(' tm_min :', s.tm_min)
 print(' tm_sec :', s.tm_sec)
 print(' tm_wday :', s.tm_wday)
 print(' tm_yday :', s.tm_yday)
 print(' tm_isdst:', s.tm_isdst)
print('gmtime:')
show_struct(time.gmtime())
print('\nlocaltime:')
show_struct(time.localtime())
print('\nmktime:', time.mktime(time.localtime()))

该gmtime()函数以UTC格式返回当前时间。localtime()返回当前时区,并应用当前时区。mktime()采用a struct_time并将其转换为浮点表示。

$ python3 time_struct.py
gmtime:
 tm_year : 2018
 tm_mon : 3
 tm_mday : 18
 tm_hour : 20
 tm_min : 23
 tm_sec : 14
 tm_wday : 6
 tm_yday : 77
 tm_isdst: 0
localtime:
 tm_year : 2018
 tm_mon : 3
 tm_mday : 18
 tm_hour : 16
 tm_min : 23
 tm_sec : 14
 tm_wday : 6
 tm_yday : 77
 tm_isdst: 1
mktime: 1521404594.0

使用时区

确定当前时间的功能取决于是通过程序还是使用为系统设置的默认时区设置时区。更改时区不会改变实际时间,只会改变它的表示方式。

要更改时区,请设置环境变量TZ,然后调用tzset()。时区可以指定很多细节,直到夏令时的开始和停止时间。但是,通常更容易使用时区名称,并让底层库导出其他信息。

此示例程序将时区更改为几个不同的值,并显示更改如何影响时间模块中的其他设置。

time_timezone.py

import time
import os
def show_zone_info():
 print(' TZ :', os.environ.get('TZ', '(not set)'))
 print(' tzname:', time.tzname)
 print(' Zone : {} ({})'.format(
 time.timezone, (time.timezone / 3600)))
 print(' DST :', time.daylight)
 print(' Time :', time.ctime())
 print()
print('Default :')
show_zone_info()
ZONES = [
 'GMT',
 'Europe/Amsterdam',
]
for zone in ZONES:
 os.environ['TZ'] = zone
 time.tzset()
 print(zone, ':')
 show_zone_info()

用于准备示例的系统的默认时区是US / Eastern。示例中的其他区域更改tzname,日光标志和时区偏移值。

$ python3 time_timezone.py
Default :
 TZ : (not set)
 tzname: ('EST', 'EDT')
 Zone : 18000 (5.0)
 DST : 1
 Time : Sun Mar 18 16:23:14 2018
GMT :
 TZ : GMT
 tzname: ('GMT', 'GMT')
 Zone : 0 (0.0)
 DST : 0
 Time : Sun Mar 18 20:23:14 2018
Europe/Amsterdam :
 TZ : Europe/Amsterdam
 tzname: ('CET', 'CEST')
 Zone : -3600 (-1.0)
 DST : 1
 Time : Sun Mar 18 21:23:14 2018

解析和格式化时间

这两个函数strptime()和strftime()转换之间struct_time和字符串表示时间值。有一长串格式化说明可用于支持不同样式的输入和输出。完整列表记录在time模块的库文档中。

此示例将当前时间从字符串转换为 struct_time实例并返回字符串。

time_strptime.py

import time
def show_struct(s):
 print(' tm_year :', s.tm_year)
 print(' tm_mon :', s.tm_mon)
 print(' tm_mday :', s.tm_mday)
 print(' tm_hour :', s.tm_hour)
 print(' tm_min :', s.tm_min)
 print(' tm_sec :', s.tm_sec)
 print(' tm_wday :', s.tm_wday)
 print(' tm_yday :', s.tm_yday)
 print(' tm_isdst:', s.tm_isdst)
now = time.ctime(1483391847.433716)
print('Now:', now)
parsed = time.strptime(now)
print('\nParsed:')
show_struct(parsed)
print('\nFormatted:',
 time.strftime("%a %b %d %H:%M:%S %Y", parsed))

输出字符串与输入完全不同,因为月份的日期前缀为零。

$ python3 time_strptime.py
Now: Mon Jan 2 16:17:27 2017
Parsed:
 tm_year : 2017
 tm_mon : 1
 tm_mday : 2
 tm_hour : 16
 tm_min : 17
 tm_sec : 27
 tm_wday : 0
 tm_yday : 2
 tm_isdst: -1
Formatted: Mon Jan 02 16:17:27 2017

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...