取最值的差异
- 测试
- Windows 测试结果
- Linux 测试结果
测试
测试内容:从一组 x, y, z 坐标值中获得每个维度(x、y、z)的值域范围。此处不考虑将数据临时存放到内存,再整组获取值域的操作(因为对单文件这么做问题不大,不太会有超级大的 obj 文件,但是对某个目录及其子目录下所有 obj 数据获取一个跨文件的值域范围时,很容易撑爆内存),如果只是对一个单 obj 文件统计值域则建议使用内存来换运算时间,但是这个测试点只是我的处理流程中一个原子函数,所以不考虑内存换时间的操作
最终结果:使用 if 判断比每次都尝试更新要快 ~20%
测试环境:python 3.11、win 11、debian 11(docker)
两个测试案例如下
- 使用 if 去判断大小,再更新值域
- 对每个 x, y, z 都尝试去更新值域
def bench_v1(obj_file):
x_min, y_min, z_min, x_max, y_max, z_max = float("inf"), float("inf"), float("inf"), float("-inf"), float(
"-inf"), float("-inf")
with open(obj_file, "r", encoding="utf-8") as f:
while row := f.readline():
if row.startswith("v "):
row = row.strip()
_, x, y, z, *_ = row.split()
x, y, z = float(x), float(y), float(z)
if x < x_min:
x_min = x
if x > x_max:
x_max = x
if y < y_min:
y_min = y
if y > y_max:
y_max = y
if z < z_min:
z_min = z
if z > z_max:
z_max = z
def bench_v2(obj_file):
x_min, y_min, z_min, x_max, y_max, z_max = float("inf"), float("inf"), float("inf"), float("-inf"), float(
"-inf"), float("-inf")
with open(obj_file, "r", encoding="utf-8") as f:
while row := f.readline():
if row.startswith("v "):
row = row.strip()
_, x, y, z, *_ = row.split()
x, y, z = float(x), float(y), float(z)
x_min = min(x_min, x)
x_max = max(x_max, x)
y_min = min(y_min, y)
y_max = max(y_max, y)
z_min = min(z_min, z)
z_max = max(z_max, z)
Windows 测试结果
Linux 测试结果
Linux 为 docker 版 python:3.11.9-bullseye