繁体   English   中英

numpy 数组赋值比 python 列表慢

[英]numpy array assignment is slower than python list

麻木-

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)

蟒蛇列表 -

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 在前一种情况下,您分配一个预定大小和 dtype 的缓冲区。 在后者中,您只是推迟了复制数据的开销,但也产生了必须确定数组大小和 dtype 的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM