迭代遍历Numpy数组时向同个数组追加值的更优实现方案咨询
优化方案
你现有实现的核心问题有两个:
np.append每次调用都会全量拷贝原有数组生成新实例,数据量较大时会产生O(n²)的时间开销,性能很差- 用try-except捕获索引异常终止循环的写法可读性低,也存在额外的性能损耗
下面是不同场景下的更优实现:
场景1:小数据量、希望改动最小
直接将异常判断替换为长度判断即可,逻辑清晰性能也略有提升:
i = 0 while i < len(objArray): obj = objArray[i] i += 1 # 此处保留你原有的条件判断逻辑 if condition: objArray = np.append(objArray, newObject)
场景2:数据量较大、追求性能
因为numpy数组是定长内存结构,天生不适合动态追加操作,建议中间逻辑用列表处理,最后再转回numpy数组,既可以复用你最开始的for循环逻辑,性能也最优:
# 先把numpy数组转为列表 obj_list = objArray.tolist() # 完全复用你最初的列表遍历逻辑,不需要修改循环写法 for obj in obj_list: # 此处保留你原有的条件判断逻辑 if condition: obj_list.append(newObject) # 处理完成后转回numpy数组,满足其他模块的类型要求 objArray = np.array(obj_list)
场景3:不想引入列表、全程用numpy操作
可以用临时缓存批量合并的方式减少np.append的调用次数,避免频繁拷贝数组:
append_buffer = [] i = 0 arr_length = len(objArray) while i < arr_length + len(append_buffer): # 优先读取原数组元素,原数组读完读缓存的元素 if i < arr_length: obj = objArray[i] else: obj = append_buffer[i - arr_length] i += 1 # 此处保留你原有的条件判断逻辑 if condition: append_buffer.append(newObject) # 最后一次性合并缓存的元素到原数组,只做一次数组拷贝 if append_buffer: objArray = np.concatenate([objArray, np.array(append_buffer)])
内容的提问来源于stack exchange,提问作者Dalton B
相关产品推荐
相关产品推荐

