最近我回答了THIS https://stackoverflow.com/questions/31596979/multiplication-between-2-lists/31597029#31597029想要两个列表相乘的问题,一些用户建议使用 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")
result :
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 倍。因此,除了列表推导式在 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")
result :
first: 10.7480301857
second : 13.1278889179