返回介绍

15.1 time 模块

发布于 2024-01-22 21:44:06 字数 2554 浏览 0 评论 0 收藏 0

计算机的系统时钟设置为特定的日期、时间和时区。内置的time模块让Python程序能读取系统时钟的当前时间。在time模块中,time.time()和time.sleep()函数是最有用的模块。

15.1.1 time.time()函数

Unix纪元是编程中经常参考的时间:1970年1月1日0点,即协调世界时(UTC)。time.time()函数返回自那一刻以来的秒数,是一个浮点值(回想一下,浮点值只是一个带小数点的数)。这个数字称为UNIX纪元时间戳。例如,在交互式环境中输入以下代码:

>>> import time
>>> time.time()
1425063955.068649

这里,我在2015年2月27日,太平洋标准时间11:05(或7:05 PM UTC),调用time.time()。返回值是Unix纪元的那一刻与time.time()被调用的那一刻之间的秒数。

注意

交互式环境的例子得到的日期和时间,是我在2015年2月写这一章的时间。除非你是时间旅行者,否则得到的日期和时间会不同。

纪元时间戳可以用于剖析代码,也就是测量一段代码的运行时间。如果在代码块开始时调用time.time(),并在结束时再次调用,就可以用第二个时间戳减去第一个,得到这两次调用之间经过的时间。例如,打开一个新的文件编辑器窗口,然后输入以下程序:

 import time
❶ def calcProd():
     # Calculate the product of the first 100,000 numbers.
     product = 1
     for i in range(1, 100000):
         product = product * i
     return product

❷ startTime = time.time()
 prod = calcProd()
❸ endTime = time.time()
❹ print('The result is %s digits long.' % (len(str(prod))))
❺ print('Took %s seconds to calculate.' % (endTime - startTime))

在❶行,我们定义了函数calcProd(),循环遍历1至99999的整数,返回它们的乘积。在❷行,我们调用time.time(),将结果保存在startTime中。调用calcProd()后,我们再次调用time.time(),将结果保存endTime中❸。最后我们打印calcProd()返回的乘积的长度❹,以及运行calcProd()的时间❺。

将该程序保存为calcProd.py,并运行它。输出看起来像这样:

The result is 456569 digits long.
Took 2.844162940979004 seconds to calculate.

注意

另一种剖析代码的方法是利用cProfile.run()函数。与简单的time.time()技术相比,它提供了详细的信息。cProfile.run()函数在https://docs.python.org/3/library/ profile.html有解释。

15.1.2 time.sleep()函数

如果需要让程序暂停一下,就调用time.sleep()函数,并传入希望程序暂停的秒数。在交互式环境中输入以下代码:

 >>> import time
 >>> for i in range(3):
❶           print('Tick')
❷           time.sleep(1)
❸           print('Tock')
❹           time.sleep(1)

 Tick
 Tock
 Tick
 Tock
 Tick
 Tock
❺ >>> time.sleep(5)

for循环将打印Tick❶,暂停一秒钟❷,打印Tock❸,暂停一秒钟❹,打印Tick,暂停,如此继续,直到Tick和Tock分别被打印3次。

time.sleep()函数将阻塞(也就是说,它不会返回或让程序执行其他代码),直到传递给time.sleep()的秒数流逝。例如,如果输入time.sleep(5) ❺,会在5秒后才看到下一个提示符(>>>)。

请注意,在IDLE中按Ctrl-C不会中断time.sleep()调用。IDLE会等待到暂停结束,再抛出KeyboardInterrupt异常。要绕过这个问题,不要用一次time.sleep(30)调用来暂停30秒,而是使用for循环执行30次time.sleep(1)调用。

 >>> for i in range(30):
     time.sleep(1)

如果在这30秒内的某个时候按Ctrl-C,应该马上看到抛出KeyboardInterrupt异常。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文