相关疑难解决方法(0)

为什么列表理解比乘法数组的numpy要快得多?

最近我回答了这个想要两个列表相乘的问题,一些用户提出了以下使用numpy的方法,我认为这是正确的方法:

(a.T*b).T
Run Code Online (Sandbox Code Playgroud)

我也发现它aray.resize()具有相同的性能.任何方式另一个答案建议使用列表理解的解决方案:

[[m*n for n in second] for m, second in zip(b,a)]
Run Code Online (Sandbox Code Playgroud)

但在基准测试之后我发现列表理解比numpy表现得更快:

from timeit import timeit

s1="""
a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]

[[m*n for n in second] for m, second in zip(b,a)]
"""
s2="""
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([4,2,1])

(a.T*b).T
"""

print ' first: ' ,timeit(stmt=s1, number=1000000)
print 'second : ',timeit(stmt=s2, number=1000000,setup="import numpy as np")
Run Code Online (Sandbox Code Playgroud)

结果:

 first:  1.49778485298
second :  7.43547797203
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,numpy大约快5倍.但最令人惊讶的是,它在不使用转置的情况下更快,并且代码如下:

a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([[4],[2],[1]])

a*b 
Run Code Online (Sandbox Code Playgroud)

列表理解仍然快5倍.除此之外,列表推导在C中执行,这里我们使用了2个嵌套循环和zip函数那么原因是什么呢?是因为*在numpy 中操作?

另外请注意,有没有问题,timeit在这里我的推杆的import部分setup.

我也尝试过更大的arras,差异越小但仍然没有意义:

s1=""" …
Run Code Online (Sandbox Code Playgroud)

python performance numpy list-comprehension matrix-multiplication

7
推荐指数
1
解决办法
5251
查看次数