写一手漂亮的代码,走向极致的编程 一、代码运行时间分析 (4)

输出

Wrote profile results to code.py.lprof Timer unit: 1e-07 s Total time: 137.019 s File: code.py Function: calculate_z_serial_purepython at line 23 Line # Hits Time Per Hit % Time Line Contents ============================================================== 23 @profile 24 def calculate_z_serial_purepython(maxiter, zs, cs): 25 1 89776.0 89776.0 0.0 output = [0] * len(zs) 26 1000001 9990393.0 10.0 0.7 for i in range(len(zs)): 27 1000000 9244029.0 9.2 0.7 n = 0 28 1000000 10851654.0 10.9 0.8 z = zs[i] 29 1000000 10242762.0 10.2 0.7 c = cs[i] 30 34219980 558122806.0 16.3 40.7 while abs(z) < 2 and n < maxiter: 31 33219980 403539388.0 12.1 29.5 z = z * z + c 32 33219980 356918574.0 10.7 26.0 n += 1 33 1000000 11186107.0 11.2 0.8 output[i] = n 34 1 12.0 12.0 0.0 return output

运行时间比较长。。不过,这里可以发现,耗时的操作主要都在 while 循环中,做判断的耗时最长,但是这里我们并不知道是 abs(z) < 2 还是 n < maxiter 更花时间。z 与 n 的更新也比较花时间,这是因为在每次循环时, Python 的动态查询机制都在工作。

那么,这里可以通过 timeit 来进行测试

In [1]: z = 0 + 0j In [2]: %timeit abs(z) < 2 357 ns ± 21.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) In [3]: n = 1 In [4]: maxiter = 300 In [5]: %timeit n < maxiter 119 ns ± 6.91 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

可以看到,n < maxiter 所需时间更短,并且每301次会有一次 False,而 abs(z) < 2 为 False 的次数我们并不好估计,占比约为前面图片中白色部分所占比例。因此,我们可以假设交换两条语句的顺序可以使得程序运行速度更快。

Total time: 132.816 s File: code.py Function: calculate_z_serial_purepython at line 23 Line # Hits Time Per Hit % Time Line Contents ============================================================== 23 @profile 24 def calculate_z_serial_purepython(maxiter, zs, cs): 25 1 83002.0 83002.0 0.0 output = [0] * len(zs) 26 1000001 9833163.0 9.8 0.7 for i in range(len(zs)): 27 1000000 9241272.0 9.2 0.7 n = 0 28 1000000 10667576.0 10.7 0.8 z = zs[i] 29 1000000 10091308.0 10.1 0.8 c = cs[i] 30 34219980 531157092.0 15.5 40.0 while n < maxiter and abs(z) < 2: 31 33219980 393275303.0 11.8 29.6 z = z * z + c 32 33219980 352964180.0 10.6 26.6 n += 1 33 1000000 10851379.0 10.9 0.8 output[i] = n 34 1 11.0 11.0 0.0 return output

可以看到,确实是有所优化。

小节

从开始学习编程到现在差不多快 3 年了,之前可以说是从来没有利用这些工具来对代码性能进行过分析,最多也只是通过算法复杂度的分析来进行优化,接触了这些之后就感觉,需要学习的东西还有很多。在近期进行的华为软挑中,队友也曾对代码(C++)的运行时间进行过分析,如下图。

写一手漂亮的代码,走向极致的编程 一、代码运行时间分析

下篇将介绍对运行时内存的分析。

参考

《Python 高性能编程》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwyzxj.html