附录B 更多IPython系统相关内容
B.3.2 对代码测时:%time和%timeit
对于更大规模或更长时间运行的数据分析应用程序,你可能希望测量各个组件或单个语句或函数调用的执行时间。你可能需要一个在复杂过程中哪些函数最耗时的报告。幸运的是,IPython允许你非常方便地在开发、测试代码的时候获得这些信息。
手工使用内置time模块及其函数time.clock和time.time通常是单调和重复的,因为你必须编写相同的无趣样板代码
由于这是一个很常见的操作,而IPython有两个魔术函数,%time和%timeit,为你自动执行此过程。
%time一次运行一条语句,并报告总执行时间。假设我们有一大串字符串,我们想比较不同的选择所有的字符串中以特殊前缀开始的字符串的方法。这里有一个包含600,000个字符串的列表和两个只选出以’foo’开头的方法(见图B-1)

Wall time("wall-clock time"简写,壁钟时间)是我们主要感兴趣的数字。所以,看起来第一种方法需要两倍以上的时间,但这不是一个非常精确的测量。如果你尝试多用%time测试,你就发现测试结果是个变量。为了获得更精确的测量,可以使用%timeit魔术函数。给定任意的语句,%timeit有多次运行语句以产生更准确的平均运行时间的功能(见图B-2)

这个看似普通的例子表明,理解本书中使用的Python标准库、NumPy、pandas以及其他的类库的性能特征是很有必要的。在更大型的数据分析应用中,相差的毫秒就开始累加了!
%timeit对于执行时间很短的分析语句和函数特别有用,甚至在微秒(百万分之一秒)或纳秒(十亿分之一秒)的级别依然有效。
这些时间可能看起来微不足道,但是,调用100万次的20微秒函数比5毫秒的函数要多用15秒。在之前的例子中,我们可以非常直接地对比两个字符串操作来理解它们的性能差异(见图B-3)

B.3.3 基础分析:%prun和%run -p
代码分析与代码测时相关性很高,但代码分析更多关注于时间开销的位置。主要的Python分析工具是cProfile模块,该模块不是专用于IPython。cProfile执行程序或任意代码块,同时记录每个函数花费多少时间。
使用cProfile的常用方法是在命令行上运行整个程序,并输出每个函数的聚合时间。假设我们有一个简单的脚本,它在循环中执行一些线性代数(计算一系列100×100矩阵的最大绝对特征值)
网友评论