小编Ben*_*man的帖子

为什么B = numpy.dot(A,x)通过做B [i,:,] = numpy.dot(A [i,:,:],x)来循环这么慢?

我得到了一些我无法解释的效率测试结果.

我想组装一个矩阵B,其第i个条目B [i,:,:] = A [i,:,:].dot(x),其中每个A [i,:,:]是一个2D矩阵, x也是如此.

我可以这三种方式来测试性能我做的随机(numpy.random.randn)矩阵A =(10,1000,1000),x =(1000,1200).我得到以下时间结果:

(1)单个多维点积

B = A.dot(x)

total time: 102.361 s
Run Code Online (Sandbox Code Playgroud)

(2)循环通过i并执行2D点积

   # initialize B = np.zeros([dim1, dim2, dim3])
   for i in range(A.shape[0]):
       B[i,:,:] = A[i,:,:].dot(x)

total time: 0.826 s
Run Code Online (Sandbox Code Playgroud)

(3)numpy.einsum

B3 = np.einsum("ijk, kl -> ijl", A, x)

total time: 8.289 s
Run Code Online (Sandbox Code Playgroud)

因此,选项(2)是迄今为止最快的.但是,仅考虑(1)和(2),我看不出它们之间的巨大差异.如何循环和做2D点产品的速度要快124倍?他们都使用numpy.dot.任何见解?

我在下面包含了用于上述结果的代码:

import numpy as np
import numpy.random as npr
import time

dim1, dim2, dim3 = 10, 1000, 1200
A = npr.randn(dim1, dim2, dim2)
x = npr.randn(dim2, …
Run Code Online (Sandbox Code Playgroud)

python product numpy multidimensional-array

9
推荐指数
2
解决办法
1800
查看次数

标签 统计

multidimensional-array ×1

numpy ×1

product ×1

python ×1