获取当前时间、时间格式化输出、测量运行时长

在日常编程时,我们经常会需要使用并输出系统当时的时间,或者是测量一个程序的运行时长。而这个时候,我们就需要用到 python 官方模块的 time 模块。

下面是 time 模块中的几个常用的函数:

1. time() - 函数与程序计时

time() 是一个最基础的函数。它返回一个以秒为单位的时间。先放一个实例测试一下。

>>> import time
>>> time.time()
1533368014.331627

可以看到它返回的值比较大。其实 time() 函数返回的是自1970年1月1日以来所经历的数,因为可读性比较差,所以我们一般不会去使用它。当然, time() 函数有一个比较常见的运用,就是程序计时。比如说,你要测量一个循环所消耗的时间,就可以这么写:

from time import *
ls = [1, 2, 3, 4, 5]
start = time()
for item in ls:
    print(item)
end = time()
print(end - start)

运行结果:

1
2
3
4
5
0.0019230842590332031

可见,循环打印了五次的耗时大概是 0.002 秒。许多的算法有着大量的循环,一般循环耗时会很大,而如果需要检测一个算法的优化程度,测量运行时长是一个非常有效的标准。

2. perf_counter() - 更精确地计时

当然,当你对测量的精度要求不高时, time() 函数足以使用。但是如果你想更准确地计时,可以使用 perf_counter() 函数。 perf_counter() 函数返回的是CPU计时的精确时间,单位也是秒。

当用了 perf_counter() 函数之后,上面的结果变为了 0.002030177987762727

3. sleep() - CPU要休息一下了

time模块中有一个比较常用的函数 sleep(s) ,它可以让程序暂停 s 秒。这个功能在进行无限循环时可以控制循环频率(比如说爬虫)。不过, sleep(1) 并不代表这个程序正好暂停了1s,我们可以用上面介绍的计时程序来测试一下。

from time import *
ls = [1, 2, 3, 4, 5]
start = perf_counter()
sleep(1)
end = perf_counter()
print(end - start)
1.0043321669945726

当然误差并不算太大,但是当 sleep() 的时间特别短的时候,就不能很准确地暂停。

4. ctime() - 文本化输出时间

既然 time() 函数显示当前时间的格式较差,那么 time 模块有没有能够用易读的方式输出时间的函数呢?难道要按照秒数自己去算吗?

哈哈, python 这么万能,这当然已经被考虑进去了。 ctime() 这个函数就可以将当前时间按照字符串格式输出。

>>> time.ctime()
'Sat Aug4 15:58:56 2018'

嗯,这样看起来是不是好多了。但是假如你不习惯年份在后的形式,也不想输出星期几,而是想要输出 2018 08 04 16:00 这样的格式, ctime() 便不能满足我们对于时间格式化的要求了。所以我们需要学习“格式化输出”时间。

5. strftime() 的格式化 与 localtime() / gmtime()

首先是 strftime(string, time_t) 这个函数,其中 string 参数为格式化的字符串,它有以下几种格式,是不是看着很像 C 里面 printf() 函数的格式化?

介绍完了 string 的格式,那么 time_t 呢? time_t 这个参数需要的是时间结构体,这个不需要我们完成,我们可以调用 localtime() 这个函数来直接获得。(当然了, gmtime() 这个函数也可以返回一个时间结构体,但是它是标准时间,中国是 UTC +8 时间。所以用 gmtime() 会比正常时间慢八小时)

所以比如说我们要输出类似于 2018 08 04 16:00 这样的时间格式,我们只需要用以下的代码:

>>> time.strftime("%Y %m %d %H:%M", time.localtime())
'2018 08 04 16:24'

这样就实现了自定义时间文本输出的功能了。

结语

关于 time 模块的使用就介绍到这里。当然了, time 模块还有很多好玩的函数。因为不是很常用,而且限于篇幅,就不再赘述了。有关 time 模块的其他的资料,大家可以看 16.3. time — Time access and conversions