time库是Python提供的处理时间的标准库。time库提供系统级精确计时器的计时功能,可以用来分析程序性能,也可以让程序暂停运行时间。

time库概述

time库的功能主要分为三个方面:时间处理、时间格式化和计时

  • 时间处理主要包括四个函数:
    • t i m e . t i m e ( ) 、 time.gmtime()、time.localtime() 、time.ctime()。
  • 时间格式化主要包括3个函数:
    • time.mktime()、 time.strftime()、time.strptime()。
  • 计 时 主 要 包 括 3 个 函 数 :
    • t i m e . s l e e p ( ) 、 time.monotonic()、time.perf_counter()

代码示例

时间处理

  • time.time()获取当前时间戳
  • time.gmtime(secs)获取当前时间戳对应的struct_time对象
  • time.localtime(secs)获取当前时间戳对应的本地时间的struct_time对象
  • time.ctime(secs)获取当前时间戳对应的易读字符串表示,内部会调用time.localtime()函数以输出当地时间。
# 使用time.time()获取当前时间戳
In [14]: time.time()
Out[14]: 1552611968.8586483

# 使用time.gmtime(secs)获取当前时间戳对应的struct_time对象
In [18]: time.gmtime(time.time())
Out[18]: time.struct_time(tm_year=2019, tm_mon=3, tm_mday=15, tm_hour=1, tm_min=6, tm_sec=51, tm_wday=4
, tm_yday=74, tm_isdst=0)

# 使用time.localtime(secs)获取当前时间戳对应的本地时间的struct_time对象
# 注意:结果与gmtime的区别,UTC时间已自动转换为北京时间
In [19]: time.localtime(time.time())
Out[19]: time.struct_time(tm_year=2019, tm_mon=3, tm_mday=15, tm_hour=9, tm_min=8, tm_sec=46, tm_wday=4
, tm_yday=74, tm_isdst=0)

# 使用time.ctime(secs)获取当前时间戳对应的
# 易读字符串表示,内部会调用time.localtime()
# 函数以输出当地时间。
In [20]: time.ctime(time.time())
Out[20]: 'Fri Mar 15 09:10:05 2019'

时间格式化

  • 使用time.mktime(t) 将struct_time对象t转换 为时间戳,注意t代表当地时间。struct_time 对象的元素如下
  • time.strftime()函数是时间格式化最有效的方法,几 乎可以以任何通用格式输出时间。该方法利用一个 格式字符串,对时间格式进行表达。

strftime()方法的格式化控制符

  • strptime()方法与strftime()方法完全相反,用 于提取字符串中时间来生成strut_time对象, 可以很灵活的作为time模块的输入接口
In [22]: t = time.localtime(time.time())
# 调用time.mktime(t)函数
In [23]: time.mktime(t)
Out[23]: 1552612358.0

In [24]: time.ctime(time.mktime(t))
Out[24]: 'Fri Mar 15 09:12:38 2019'

In [25]: lctime = time.localtime()
In [26]: lctime
Out[26]: time.struct_time(tm_year=2019, tm_mon=3, tm_mday=15, tm_hour=9, tm_min=16, tm_sec=57, tm_wday=
4, tm_yday=74, tm_isdst=0)
# 调用time.strftime()函数
In [27]: time.strftime("%Y-%m-%d %H:%M:%S",lctime)
Out[27]: '2019-03-15 09:16:57'

# strptime()的使用
In [28]: timeString = '2018-01-30 1:23:20'

In [30]: time.strptime(timeString,"%Y-%m-%d %H:%M:%S")
Out[30]: time.struct_time(tm_year=2018, tm_mon=1, tm_mday=30, tm_hour=1, tm_min=23, tm_sec=20, tm_wday=
1, tm_yday=30, tm_isdst=-1)

程序计时

  • 程序计时是非常常用的功能,尤其是对于运 行时间较长的程序,往往需要先进行小规模 (短时间)的实验,并根据实验结果预估最 终程序的大致运行时间。
  • 程序计时主要要包含三个要素:程序开始/结 束时间、程序运行总时间、程序各核心模块 运行时间。

下面以1千万次循环计时为例介绍程序计时的 实现,并进一步理解time模块相关函数的运用。

# -*- coding: utf-8 -*-
import time
def run():
    limit = 10**8
    while limit > 0:
        limit -= 1
def func1():
    time.sleep(0.2)
def func2():
    time.sleep(0.4)
def main():
    # 获取当前时间戳对应的本地时间的struct_time对象
    startTime = time.localtime()
    # 格式化输出开始时间
    print('Start time:',time.strftime('%Y-%m-%d %H:%M:%S',startTime))
    ''' 调用一次 perf_counter(),从计算机系统里随机选一个时间点A,
    计算其距离当前时间点B1有多少秒。当第二次调用该函数时,
    默认从第一次调用的时间点A算起,距离当前时间点B2有多少秒。
    两个函数取差,即实现从时间点B1到B2的计时功能。
    '''
    startPerfCounter = time.perf_counter()
    func1()
    otherLoop1PerfCounter = time.perf_counter()
    otherLoop1Perf = otherLoop1PerfCounter - startPerfCounter
    run()
    coreLoopPerfCounter = time.perf_counter()
    coreLoopPerf = coreLoopPerfCounter - otherLoop1PerfCounter
    func2()
    otherLoop2PerfCounter = time.perf_counter()
    otherLoop2Perf = otherLoop2PerfCounter - coreLoopPerfCounter
    endPerfCounter = time.perf_counter()
    totalPerf = endPerfCounter - startPerfCounter
    endTime = time.localtime()
    print("func1 use time:{}s".format(otherLoop1Perf))
    print("run use time:{}s".format(coreLoopPerf))
    print("func2 use time:{}s".format(otherLoop2Perf))
    print("Func use times:{}s".format(totalPerf))
    print('Func end time:', time.strftime('%Y-%m-%d %H:%M:%S', endTime))
main()

# 运行结果
Start time: 2019-03-15 09:37:45
func1 use time:0.200246884s
run use time:9.649773082s
func2 use time:0.4004062449999992s
Func use times:10.250427669999999s
Func end time: 2019-03-15 09:37:55

发表回复