477 字
2 分钟
python 双层嵌套循环
前言
分析 python 中如何设置双层嵌套循环效率最高:
-
数组的遍历方式
-
内外层循环数
实验
案例1 内外层循环数量相同,比较数组遍历方式的效率
内层对列遍历,外层对行遍历,平均用时 15.16065s
mat = np.zeros((10000, 10000))for h in range(height): for w in range(width): a = mat[h, w]
内层对行遍历,外层对列遍历,平均用时 16.26099
mat = np.zeros((10000, 10000))for w in range(width): for h in range(height): a = mat[h, w]
案例2 循环总数量相同,内外层循环数量不同
内存循环数量比外层循环数量多,平均用时 282.56361s
for _ in range(10): for _ in range(10000000): a = 0 for _ in range(10): a = a + 1.1 a = a * 1.1 a = 0
外层循环数量比内存循环数量多,平均用时 282.43570
for _ in range(10000000): for _ in range(10): a = 0 for _ in range(10): a = a + 1.1 a = a * 1.1 a = 0
结论
-
相同任务下,按行遍历比按列遍历更快:连续内存的调度相比非连续内存更快
-
相同任务下,内外层循环数量差别很小:Cache 的命中率
完整代码
import timeimport numpy as np
times = [[], []]for _ in range(10): time.sleep(1) mat = np.zeros((10000, 10000)) height, width = mat.shape begin_time = time.time() for h in range(height): for w in range(width): a = mat[h, w] cost_time1 = time.time() - begin_time
time.sleep(1) mat = np.zeros((10000, 10000)) height, width = mat.shape begin_time = time.time() for w in range(width): for h in range(height): a = mat[h, w] cost_time2 = time.time() - begin_time
times[0].append(cost_time1) times[1].append(cost_time2)
print(f"按行遍历 {np.average(times[0]):.5f}s")print(f"按列遍历 {np.average(times[1]):.5f}s")
times = [[], []]for _ in range(10): time.sleep(1) a = 0 begin_time = time.time() for _ in range(10): for _ in range(10000000): a = 0 for _ in range(10): a = a + 1.1 a = a * 1.1 a = 0 cost_time1 = time.time() - begin_time
time.sleep(1) begin_time = time.time() for _ in range(10): for _ in range(10000000): a = 0 for _ in range(10): a = a + 1.1 a = a * 1.1 a = 0 cost_time2 = time.time() - begin_time
times[0].append(cost_time1) times[1].append(cost_time2)
print(f"内循环多 {np.average(times[0]):.5f}s")print(f"外循环多 {np.average(times[1]):.5f}s")
python 双层嵌套循环
https://fuwari.vercel.app/posts/编程/python/python-双层嵌套循环/