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

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

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

该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

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...