Python多参数遍历循环优化:修复bitwise_and报错并提升运行速度
代码报错修复与性能优化方案
报错根因
你遇到的报错:
ufunc 'bitwise_and' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
根源是代码里的&是Python的按位与运算符,存在两个问题:
- 优先级高于
==,表达式实际执行逻辑为x == (data.par_lambda & y) == (data.par_alpha & z) == data.l0,完全不符合你要的三个条件同时成立的需求 - 按位与不支持浮点数输入,直接触发类型不兼容报错
把&替换成逻辑与运算符and即可解决报错问题。
性能优化方案
你当前的两层循环时间复杂度为O(1000*1000)=1e6,虽然量级不大,但可以通过预构建索引字典把时间复杂度降到O(1000),优化后逻辑更简洁,运行速度也更快:
- 先遍历一次datasets,用三元组
(par_lambda, par_alpha, l0)作为key,把对应的类实例存到字典里 - 再遍历参数组合直接从字典取值,不需要每次循环全量扫描datasets
优化后代码如下:
import os import numpy as np from tqdm import tqdm # 第一步:预构建参数到数据集实例的映射字典,仅需遍历一次datasets data_map = {} for data in datasets: # 若参数存在浮点数精度误差,可先统一保留指定位数再做key,避免匹配失败 key = (round(data.par_lambda,2), round(data.par_alpha,2), round(data.l0,2)) data_map[key] = data # 第二步:遍历所有参数组合,直接查表取值 the_vals = [(x, y, z) for x in val_lambda for y in val_alpha for z in l] for (x, y, z) in tqdm(the_vals): # 直接从字典查,找不到就跳过避免报错 data = data_map.get((round(x,2), round(y,2), round(z,2))) if not data: continue # 用f-string简化路径格式化 filename_msd = f"./simulation/lamda ={x:.2f}/alpha ={y:.2f}/cargo/l0={z:.2f}/cargo_msd.csv" os.makedirs(os.path.dirname(filename_msd), exist_ok=True) np.savetxt(filename_msd, data.msd, delimiter=',')
额外注意事项
- 原代码路径字符串里
alpha前面多了一个多余空格,会生成带冗余空格的目录,上面的代码已经做了修正,你可以根据实际需要调整路径格式 - 如果存在参数组合对应多个数据集的情况,把字典的value改成列表存储即可,每次匹配到就append到对应key的列表里
内容的提问来源于stack exchange,提问作者user332496
相关产品推荐
相关产品推荐

