这些是我在较慢机器上的计时
In [1034]: timeit [i for i in np.arange(10000000)]
1 loop, best of 3: 2.16 s per loop
如果我直接生成范围(Py3 所以这是一个生成器)时间会好得多。以此为基准来理解这种大小的列表。
In [1035]: timeit [i for i in range(10000000)]
1 loop, best of 3: 1.26 s per loop
tolist 先将 arange 转换为列表;需要更长的时间,但迭代仍在列表中
In [1036]: timeit [i for i in np.arange(10000000).tolist()]
1 loop, best of 3: 1.6 s per loop
使用list() - 与对数组的直接迭代同时进行;这表明直接迭代首先执行此操作。
In [1037]: timeit [i for i in list(np.arange(10000000))]
1 loop, best of 3: 2.18 s per loop
In [1038]: timeit np.arange(10000000).tolist()
1 loop, best of 3: 927 ms per loop
对 .tolist 进行同样的迭代
In [1039]: timeit list(np.arange(10000000))
1 loop, best of 3: 1.55 s per loop
一般来说,如果你必须循环,处理一个列表会更快。访问列表元素更简单。
查看索引返回的元素。
a[0] 是另一个numpy 对象;它是由a 中的值构造的,而不仅仅是一个获取的值
list(a)[0]是同一类型;该列表只是[a[0], a[1], a[2]]]
In [1043]: a = np.arange(3)
In [1044]: type(a[0])
Out[1044]: numpy.int32
In [1045]: ll=list(a)
In [1046]: type(ll[0])
Out[1046]: numpy.int32
但tolist 将数组转换为纯列表,在本例中为整数列表。它比list() 做了更多的工作,但是在编译后的代码中。
In [1047]: ll=a.tolist()
In [1048]: type(ll[0])
Out[1048]: int
一般不要使用list(anarray)。它很少做任何有用的事情,并且没有tolist()那么强大。
遍历数组的最快方法是什么 - 没有。至少不是在 Python 中;在 c 代码中有快速的方法。
a.tolist() 是从数组创建列表整数的最快的矢量化方法。它会迭代,但在编译后的代码中这样做。
但你真正的目标是什么?