Gần đây tôi đã trả lời để THIS câu hỏi mà muốn nhân của 2 danh sách, một số người dùng gợi ý theo cách sau sử dụng NumPy, bên cạnh tôi mà tôi nghĩ là cách thích hợp:Tại sao việc đọc danh sách nhanh hơn nhiều so với việc gộp mảng để nhân mảng?
(a.T*b).T
Ngoài ra tôi thấy rằng aray.resize()
có cùng hiệu suất như thế. cách nào câu trả lời khác đề nghị một giải pháp sử dụng danh sách hiểu:
[[m*n for n in second] for m, second in zip(b,a)]
Nhưng sau khi benchmark tôi thấy rằng danh sách hiểu biết thực hiện rất nhanh hơn 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")
kết quả:
first: 1.49778485298
second : 7.43547797203
Như bạn có thể thấy numpy là khoảng 5 lần nhanh hơn. nhưng điều đáng ngạc nhiên nhất là nó nhanh hơn mà không cần dùng transpose, và cho đoạn mã sau:
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([[4],[2],[1]])
a*b
Danh sách hiểu vẫn là 5 lần faster.So ngoài của điểm này liệt kê comprehensions thực hiện trong C ở đây chúng tôi sử dụng 2 vòng lặp lồng nhau và một hàm zip
Vậy điều gì có thể là lý do? Có phải vì hoạt động *
trong không?
Cũng lưu ý rằng không có vấn đề gì với timeit
tại đây tôi đã putted import
một phần trong setup
.
Tôi cũng đã thử nó với arras lớn, sự khác biệt được thấp hơn nhưng vẫn không có ý nghĩa:
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")
kết quả:
first: 10.7480301857
second : 13.1278889179
.... Thử nhiều mảng lớn hơn? – NightShadeQueen
@NightShadeQueen Tôi đã thử rằng kết quả vẫn giống nhau – Kasramvd
@Kasramvd bạn đã thử bao nhiêu lần? – Falmarri