为何list(numpy.array)转换速度慢?a.tolist()更快原因探究
为什么将NumPy数组转换为Python列表时,
list(numpy.array)比numpy.array.tolist()慢? 这个差异其实是两种实现逻辑的效率差导致的,我来拆解一下背后的原因:
首先,list()是Python的内置通用函数,它的工作方式是迭代传入的可迭代对象,逐个处理元素。当你把NumPy数组传给list()时,它会开启一个Python层面的循环,每次从数组里取出一个元素——而NumPy数组的元素是存储在C层面的原生类型(比如np.int64),每次取出都要把这个C类型转换成对应的Python对象(比如int),再添加到列表里。这种Python级别的循环加上反复的类型转换,在处理大数组时,累积的开销会非常大。
而tolist()是NumPy专门为数组转换列表设计的方法,它完全是在C层面完成整个转换流程:直接遍历数组的底层内存块,批量把所有C类型元素转换成Python对象,然后一次性构建出完整的列表。相当于把原本Python层面的循环搬到了效率高得多的C代码里执行,自然省去了大量循环和类型转换的额外开销。
你给出的测试案例也能直观体现这个差距:
import numpy as np big_np = np.random.randint(1, 10**7, (10**7,)) %timeit list(big_np) # 1 loop, best of 3: 869 ms per loop %timeit big_np.tolist() # 1 loop, best of 3: 306 ms per loop
能看到tolist()的速度大概是list()的3倍,核心就是“专用方法的底层批量处理” vs “通用函数的上层循环处理”。
如果对比内置array模块的话,你会发现类似的规律:array.array.tolist()的速度也远快于list(array.array),本质都是同一个道理——专用方法利用底层优化跳过了Python层面的低效循环。
内容的提问来源于stack exchange,提问作者ead
相关产品推荐
相关产品推荐

