天天看点

《Python高性能编程》——2.5 用UNIX的time命令进行简单的计时

本节书摘来自异步社区《python高性能编程》一书中的第2章,第2.5节,作者[美] 戈雷利克 (micha gorelick),胡世杰,徐旭彬 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

现在让我们脱离python使用类unix操作系统的标准系统功能。下面这条命令会记录程序执行所耗费的的各方面时间,且不在意代码的内部结构:

注意我们特地使用了/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开关来获得更多输出信息:

这里最有用的指标可能是major (requiring i/o) page faults,因为它指示了操作系统是否由于ram中的数据不存在而需要从磁盘上读取页面。而这会带来速度上的惩罚。

我们的例子中对于代码和数据的需求较少,所以不会发生内存缺页错误。如果你有一个内存密集型进程,或多个需要分配和使用大量ram的进程,你就会发现这个命令可以告诉你哪个进程会因为一部分ram被交换到磁盘上这一额外的操作系统级别的磁盘访问而导致速度的下降。