番外篇:代码性能优化
学习如何评估和优化代码性能。(本节还没更新完…………)
完成一项任务很重要,高效地完成更重要。图像处理是对矩阵的操作,数据量巨大。如果代码写的不好,性能差距将很大,所以这节我们来了解下如何评估和提升代码性能。
评估代码运行时间
import cv2
start = cv2.getTickCount()
# 这里写测试代码...
end = cv2.getTickCount()
print((end - start) / cv2.getTickFrequency())
这段代码就是用来测量程序运行时间的(单位:s),其中cv2.getTickCount()
函数得到电脑启动以来的时钟周期数,cv2.getTickFrequency()
返回你电脑的主频,前后相减再除以主频就是你代码的运行时间(这样解释并不完全准确,但能理解就行)。另外,也可以用 Python 中的 time 模块计时:
import time
start = time.clock()
# 这里写测试代码...
end = time.clock()
print(end - start)
经验之谈:如果你使用的是IPython或Jupyter Notebook开发环境,性能分析将会非常方便,详情请参考:Timing and Profiling in IPython
优化原则
- 数据元素少时用 Python 语法,数据元素多时用 Numpy:
x = 10
z = np.uint8([10])
# 尝试比较下面三句话各自的运行时间
y = x * x * x # (1.6410249677846285e-06)
y = x**3 # (2.461537451676943e-06)
y = z * z * z # 最慢 (3.1179474387907945e-05)
所以 Numpy 的运行速度并不一定比 Python 本身语法快,元素数量较少时,请用 Python 本身格式。
- 尽量避免使用循环,尤其嵌套循环,因为极其慢!!!
- 优先使用 OpenCV/Numpy 中封装好的函数
- 尽量将数据向量化,变成 Numpy 的数据格式
- 尽量避免数组的复制操作