Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于二维数组乘法,为什么for循环比numpy快_Python_For Loop_Numpy - Fatal编程技术网

Python 对于二维数组乘法,为什么for循环比numpy快

Python 对于二维数组乘法,为什么for循环比numpy快,python,for-loop,numpy,Python,For Loop,Numpy,考虑以下两个函数,它们基本上是将小序列中的每个数字与大序列中的每个数字相乘,以构建二维数组,然后将数组中的所有值加倍noloop()使用2D numpy数组的直接乘法并返回结果,而loop()使用for循环在arr1上迭代并逐渐建立输出数组 import numpy as np arr1 = np.random.rand(100, 1) arr2 = np.random.rand(1, 100000) def noloop(): return (arr1*arr2)*2 def l

考虑以下两个函数,它们基本上是将小序列中的每个数字与大序列中的每个数字相乘,以构建二维数组,然后将数组中的所有值加倍
noloop()
使用2D numpy数组的直接乘法并返回结果,而
loop()
使用for循环在
arr1
上迭代并逐渐建立输出数组

import numpy as np

arr1 = np.random.rand(100, 1)
arr2 = np.random.rand(1, 100000)

def noloop():
    return (arr1*arr2)*2

def loop():
    out = np.empty((arr1.size, arr2.size))
    for i in range(arr1.size):
        tmp = (arr1[i]*arr2)*2
        out[i] = tmp.reshape(tmp.size)
    return out
我期望
noloop
即使对于少量迭代也会快得多,但是对于上面的数组大小,
loop
实际上更快:

>>> %timeit noloop()
10 loops, best of 3: 64.7 ms per loop
>>> %timeit loop()
10 loops, best of 3: 41.6 ms per loop
有趣的是,如果我删除两个函数中的
*2
noloop
会更快,但只会稍微快一点:

>>> %timeit noloop()
10 loops, best of 3: 29.4 ms per loop
>>> %timeit loop()
10 loops, best of 3: 34.4 ms per loop

这些结果有没有一个很好的解释,有没有一种更快的方法来执行相同的任务?

我无法重现您的结果,但我确实发现我可以使用
numpy.multiply
获得相当大的速度(2倍)。通过使用
out
参数,您可以利用内存已经分配的事实,消除
tmp
out
的复制

def out_loop():
    out = np.empty((arr1.size, arr2.size))
    for i in range(arr1.size):
        np.multiply(arr1[i], arr2, out=out[i].reshape((1, arr2.size)))
        out[i] *= 2
    return out
在我的机器上的结果:

In [32]: %timeit out_loop()
100 loops, best of 3: 17.7 ms per loop

In [33]: %timeit loop()
10 loops, best of 3: 28.3 ms per loop

我得到的
noloop()
loop()
更快(15%),不管怎样……我在python2和python3上也得到了相反的结果。我得到的
loop
比OP建议的更快(在我的机器上是28%)。Python 3.4.1 | Anaconda 2.1.0,IPython 2.2.0 OP值来自Spyder,即QT IPython控制台。我使用Spyder外部的QT IPython控制台获得相同的结果。奇怪的是,在一个普通的IPython控制台中,
noloop()
花费的时间和以前一样长(60-70毫秒),而
loop()
花费的时间比
noloop()
长了几毫秒,也就是说,比在QT控制台中要慢得多。同样,在我的机器上,
noloop()
要快约10%。