最近看到有这么一段代码,功能为初始化一个单位矩阵,使用的嵌套循环的方式
功能上这么实现没啥问题,就是看着有点不太简洁,所以想着能不能用列表推导实现,顺便也比较一下两者的速度差距。
使用time计时,matplotlib绘制时间曲线
import time
from matplotlib import pyplot as plt
def eye_for(row, col):
m = []
for i in range(row):
m.append([])
for i in range(row):
for j in range(col):
m[i].append(1 if i == j else 0)
return m
def eye_exp(row, col):
return [
[
1 if i == j else 0
for j in range(col)
]
for i in range(row)
]
def test(row, col):
st1 = time.time()
eye_for(row, col)
ed1 = time.time()
st2 = time.time()
eye_exp(row, col)
ed2 = time.time()
return ed1 - st1, ed2 - st2
def main():
print(eye_for(3, 4)) # [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]]
print(eye_exp(3, 4)) # [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]]
ps1 = []
ps2 = []
for i in range(1, 13):
y1, y2 = test(i * 100, i * 100)
ps1.append(y1)
ps2.append(y2)
plt.plot(ps1, 'b', label='for')
plt.plot(ps2, 'r', label='exp')
plt.legend()
plt.show()
main()
在我的乞丐版surface上的结果
基本上可以看到for循环的方式是推导式的两倍, so... 列表推导不仅代码量少, 而且速度上也有很大的优势,关键很pythonic!