gpt4 book ai didi

python - numpy.dot -> MemoryError, my_dot -> 非常慢,但有效。为什么?

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:57 25 4
gpt4 key购买 nike

我正在尝试计算大小分别为 (162225, 10000) 和 (10000, 100) 的两个 numpy 数组的点积。但是,如果我调用 numpy.dot(A, B) 会发生 MemoryError。然后,我尝试编写我的实现:

def slower_dot (A, B):
"""Low-memory implementation of dot product"""
#Assuming A and B are of the right type and size
R = np.empty([A.shape[0], B.shape[1]])
for i in range(A.shape[0]):
for j in range(B.shape[1]):
R[i,j] = np.dot(A[i,:], B[:,j])
return R

它工作得很好,但当然很慢。知道 1) 这种行为背后的原因是什么以及 2) 我如何规避/解决问题吗?

我在配备 64 位、16GB 内存、运行 Ubuntu 14.10 的计算机上使用 Python 3.4.2(64 位)和 Numpy 1.9.1。

最佳答案

您遇到内存错误的原因可能是因为 numpy 试图在对 dot 的调用中复制一个或两个数组。对于中小型阵列,这通常是最有效的选择,但对于大型阵列,您需要对 numpy 进行微观管理以避免内存错误。您的 slower_dot 函数很慢主要是因为 python 函数调用开销,您遭受了 162225 x 100 次。当您想要平衡内存和性能限制时,这是处理这种情况的一种常用方法。

import numpy as np

def chunking_dot(big_matrix, small_matrix, chunk_size=100):
# Make a copy if the array is not already contiguous
small_matrix = np.ascontiguousarray(small_matrix)
R = np.empty((big_matrix.shape[0], small_matrix.shape[1]))
for i in range(0, R.shape[0], chunk_size):
end = i + chunk_size
R[i:end] = np.dot(big_matrix[i:end], small_matrix)
return R

您需要选择最适合您的特定数组大小的 chunk_size。只要所有内容都适合内存,通常较大的 block 大小会更快。

关于python - numpy.dot -> MemoryError, my_dot -> 非常慢,但有效。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27668462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com