477 字
2 分钟
python 双层嵌套循环
2023-07-26

前言#

分析 python 中如何设置双层嵌套循环效率最高:

  1. 数组的遍历方式

  2. 内外层循环数

实验#

案例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

结论#

  1. 相同任务下,按行遍历比按列遍历更快:连续内存的调度相比非连续内存更快

  2. 相同任务下,内外层循环数量差别很小:Cache 的命中率

完整代码#

import time
import 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-双层嵌套循环/
作者
Asuwee
发布于
2023-07-26
许可协议
CC BY-NC-SA 4.0