- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
15.1 time 模块
计算机的系统时钟设置为特定的日期、时间和时区。内置的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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论