NumPy中对应子数组追加合并:最快实现方法
最快实现方式推荐
针对百万次执行的需求,使用Numba JIT编译循环是最优方案,相比纯Python列表推导或numpy内置函数,能大幅提升执行速度。以下是具体实现:
1. 核心实现代码
import numpy as np import numba as nb @nb.njit def concat_obj_arrays(arr1, arr2): # 预分配结果数组,避免动态扩容开销 result = np.empty(arr1.shape, dtype=object) for i in range(arr1.shape[0]): # 合并对应位置的子数组 result[i] = np.concatenate((arr1[i], arr2[i])) return result # 示例输入 array1 = np.array([np.array([1, 2, 3]), np.array([4, 5, 6]), np.array([7, 8, 9])], dtype=object) array2 = np.array([np.array([9, 8]), np.array([0]), np.array([12])], dtype=object) # 生成结果 array_final = concat_obj_arrays(array1, array2)
2. 为什么这个方案最快?
- Numba JIT编译:将Python循环转换为机器码执行,消除了纯Python循环的解释器开销,百万次重复执行时优势极其明显。
- 预分配内存:提前创建结果数组
result,避免动态添加元素带来的内存重新分配开销。 - 使用
np.concatenate:相比np.append,concatenate直接合并数组,无需额外的数组复制操作,效率更高。
3. 对比其他方案的劣势
- 纯列表推导式:
每次执行都要经历Python循环的解释器开销,百万次执行时速度远慢于Numba方案。array_final = np.array([np.concatenate((a, b)) for a, b in zip(array1, array2)], dtype=object) np.vectorize:本质是Python循环的封装,并没有真正实现向量化加速,效率和列表推导式接近,甚至更差。
4. 注意事项
- 首次调用
concat_obj_arrays时会触发Numba编译,耗时略长,但后续百万次执行均为编译后的机器码速度,整体效率极高。 - 确保输入的
arr1和arr2形状一致,且每个元素都是numpy数组(符合题目给定的输入格式)。
内容的提问来源于stack exchange,提问作者Dreamer93
相关产品推荐
相关产品推荐

