如何用纯Numpy操作将列表的列表转为元组的列表(替代列表推导式)
如何用纯NumPy高效将嵌套列表转换为元组列表
刚好之前在处理百万级别的嵌套数据时踩过列表推导式速度慢的坑,用NumPy来处理确实能把效率提上去不少,给你几个实用的方案:
核心思路
首先得把foo()返回的Python嵌套列表转换成NumPy数组——毕竟NumPy的底层是C实现的,操作大规模数据时的开销比纯Python循环小得多。之后再利用NumPy的工具把数组的每一行转换成元组,最终得到目标格式。
具体实现方法
方法1:结合map()与NumPy数组迭代(高效简洁)
这是我平时用得最多的方式,比纯Python列表推导式快不少:
import numpy as np # 获取foo返回的嵌套列表 input_list = foo(*your_args) # 转换为NumPy数组 np_arr = np.array(input_list) # 将数组的每一行转成元组,再转为列表 tuple_list = list(map(tuple, np_arr))
为什么这个更快?因为NumPy数组的行迭代器是经过优化的,比遍历纯Python列表的开销小很多,再配合map()的高效处理,整体性能优于列表推导式。
方法2:纯NumPy函数np.apply_along_axis
如果追求“纯NumPy操作”的形式,可以用这个函数指定按行处理,把每一行转为元组:
import numpy as np input_list = foo(*your_args) np_arr = np.array(input_list) # 沿轴1(行方向)应用tuple函数,再转成Python列表 tuple_list = np.apply_along_axis(tuple, 1, np_arr).tolist()
这里要注意,np.apply_along_axis返回的是一个元素为元组的NumPy数组,最后需要调用.tolist()转成标准的Python列表。
注意事项
- 如果
foo()返回的子列表长度都一致,NumPy会自动生成二维数组(比如int类型的二维数组),这种情况下处理速度是最快的; - 如果子列表长度不一致,NumPy会生成
object类型的数组,虽然也能处理,但性能会略打折扣,不过依然比纯Python列表推导式快。
内容的提问来源于stack exchange,提问作者Roy_123
相关产品推荐
相关产品推荐

