最近,我回答到这哪曾想2所列出的乘法问题,一些用户建议使用numpy的下面的方式,沿着我的我认为这是正确的方法:
(a.T*b).T
此外,我发现aray.resize()
有这样一个相同的性能。 无论如何另一个答案建议使用列表中理解的解决方案:
[[m*n for n in second] for m, second in zip(b,a)]
但基准后,我看到名单理解的性能比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")
结果:
first: 1.49778485298
second : 7.43547797203
正如你所看到numpy的大约5倍快。 但最令人惊讶的事情是,它不使用转置,并为下面的代码速度更快:
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([[4],[2],[1]])
a*b
该列表理解仍然是5时faster.So除了这一点,列表内涵执行用C这里我们使用2嵌套循环和的zip
功能,那么可能是什么原因呢? 是不是因为操作*
在numpy的?
还要注意的是有没有问题timeit
这里我的推杆的import
部分setup
。
我还与大挂毯试了一下,差越低,但仍然没有任何意义:
s1="""
a=[[2,3,5],[3,6,2],[1,3,2]]*10000
b=[4,2,1]*10000
[[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]]*10000)
b=np.array([4,2,1]*10000)
(a.T*b).T
"""
print ' first: ' ,timeit(stmt=s1, number=1000)
print 'second : ',timeit(stmt=s2, number=1000,setup="import numpy as np")
结果:
first: 10.7480301857
second : 13.1278889179