- 内容提要
- 前言
- 作者简介
- 封面简介
- 第1章 理解高性能 Python
- 第2章 通过性能分析找到瓶颈
- 2.1 高效地分析性能
- 2.2 Julia 集合的介绍
- 2.3 计算完整的 Julia 集合
- 2.4 计时的简单方法——打印和修饰
- 2.5 用 UNIX 的 time 命令进行简单的计时
- 2.6 使用 cProfile 模块
- 2.7 用 runsnakerun 对 cProfile 的输出进行可视化
- 2.8 用 line_profiler 进行逐行分析
- 2.9 用 memory_profiler 诊断内存的用量
- 2.10 用 heapy 调查堆上的对象
- 2.11 用 dowser 实时画出变量的实例
- 2.12 用 dis 模块检查 CPython 字节码
- 2.13 在优化期间进行单元测试保持代码的正确性
- 2.14 确保性能分析成功的策略
- 2.15 小结
- 第3章 列表和元组
- 第4章 字典和集合
- 第5章 迭代器和生成器
- 第6章 矩阵和矢量计算
- 第7章 编译成 C
- 第8章 并发
- 第9章 multiprocessing 模块
- 第10章 集群和工作队列
- 第11章 使用更少的 RAM
- 第12章 现场教训
2.5 用 UNIX 的 time 命令进行简单的计时
现在让我们脱离Python使用类UNIX操作系统的标准系统功能。下面这条命令会记录程序执行所耗费的的各方面时间,且不在意代码的内部结构:
$ /usr/bin/time -p python julia1_nopil.py Length of x: 1000 Total elements: 1000000 calculate_z_serial_purepython took 12.7298331261 seconds real 13.46 user 13.40 sys 0.04
注意我们特地使用了/usr/bin/time而不是time,也就是说我们使用的是系统命令的time而不是那个更加简单而没用的shell内建版本的time。如果你用time --verbose,结果得到了一个错误,那么你使用的可能就是shell内建的time而不是系统命令的time。
通过使用-p开关,我们得到了3个结果:
real记录了整体的耗时。
user记录了CPU花在任务上的时间,但不包括内核函数耗费的时间。
sys记录了内核函数耗费的时间。
对user和sys相加就得到了CPU总共花费的时间。而这个时间和real的差则有可能是花费在等待IO上,也可能是你的系统正在忙着运行其他任务因此影响了你的测量。
time并不是专为Python脚本使用的。它还包括了启动python解释器的时间,如果你会启动很多新进程(而不是一个长期运行的单一进程),这个时间可能会很长。如果你会经常跑一些临时脚本,它们的启动时间占了整体运行时间的很大一部分,那么time更适合测量这种情况。
我们可以打开--verbose开关来获得更多输出信息:
$ /usr/bin/time --verbose python julia1_nopil.py Length of x: 1000 Total elements: 1000000 calculate_z_serial_purepython took 12.3145110607 seconds Command being timed: "python julia1_nopil.py" User time (seconds): 13.46 System time (seconds): 0.05 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 0:13.53 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 131952 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 58974 Voluntary context switches: 3 Involuntary context switches: 26 Swaps: 0 File system inputs: 0 File system outputs: 1968 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0
这里最有用的指标可能是Major (requiring I/O) page faults,因为它指示了操作系统是否由于RAM中的数据不存在而需要从磁盘上读取页面。而这会带来速度上的惩罚。
我们的例子中对于代码和数据的需求较少,所以不会发生内存缺页错误。如果你有一个内存密集型进程,或多个需要分配和使用大量RAM的进程,你就会发现这个命令可以告诉你哪个进程会因为一部分RAM被交换到磁盘上这一额外的操作系统级别的磁盘访问而导致速度的下降。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论