numpy数组分配比python列表慢



numpy-

arr = np.array([[1, 2, 3, 4]])
row = np.array([1, 2, 3, 4])
%timeit arr[0] = row
466 ns ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

python列表-

arr = [[1, 2, 3, 4]]
row = [1, 2, 3, 4]
%timeit arr[0] = row
59.3 ns ± 2.94 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each

numpy不应该是这里更快的版本吗?


以下是我的目标-

arr = np.empty((150, 4))
while True:
row = get_row_from_api() 
arr[-1] = row

是的,以这种方式使用python列表肯定会更快,因为当您将某个内容分配给python列表元素时,它不会被复制,只是重新分配了一些引用(https://developers.google.com/edu/python/lists)。Numpy将所有元素从源容器复制到目标容器。我不确定这里是否需要numpy数组,因为它们的创建不是免费的,python列表的创建速度也没有那么慢(正如我们在赋值时看到的那样(。

这两个操作的底层语义非常不同。Python列表是引用的数组。Numpy数组是数据本身的数组。

row = get_row_from_api()表示已经分配了新的列表。

将列表分配为lst[-1] = row只是将地址写入lst。通常是4或8个字节。

在数组中放置arr[i] = row就是复制数据。这是arr[i, :] = row的简写。row的每个元素都被复制到arr的缓冲区中。如果row是一个列表,那么从python对象转换为本机数字类型会产生额外的开销。

请记住,过早的优化是毫无意义的。与另一种方法相比,您为一种方法节省的时间可能微不足道。同时,如果您稍后无论如何都需要一个数组,那么预分配并快速命中可能比在最终列表中调用np.array更快。在前一种情况下,分配一个具有预定大小和数据类型的缓冲区。在后者中,您不仅推迟了复制数据的开销,而且还产生了必须计算数组大小和数据类型的开销。

相关内容

  • 没有找到相关文章

最新更新