获取当前时间、时间格式化输出、测量运行时长
在日常编程时,我们经常会需要使用并输出系统当时的时间,或者是测量一个程序的运行时长。而这个时候,我们就需要用到 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()
函数的格式化?
-
%Y 年份
-
%m 月份数字
-
%B 月份名称
-
%b 月份名称缩写
-
%d 日期
-
%A 星期
-
%a 星期缩写
-
%H 24小时制时间
-
%h 12小时制时间
-
%p AM/PM
-
%M 分钟
-
%S 秒
介绍完了 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 。