Cuối cùng tôi đã tìm thấy một nút cổ chai hiệu suất trong mã của tôi nhưng tôi bối rối vì lý do là gì. Để giải quyết nó, tôi đã thay đổi tất cả các cuộc gọi của mình là numpy.zeros_like
để thay thế sử dụng numpy.zeros
. Nhưng tại sao lại là zeros_like
sooooo chậm hơn nhiều?Tại sao hiệu suất khác biệt giữa numpy.zeros và numpy.zeros_like?
Ví dụ (lưu ý e-05
trên zeros
gọi):
>>> timeit.timeit('np.zeros((12488, 7588, 3), np.uint8)', 'import numpy as np', number = 10)
5.2928924560546875e-05
>>> timeit.timeit('np.zeros_like(x)', 'import numpy as np; x = np.zeros((12488, 7588, 3), np.uint8)', number = 10)
1.4402990341186523
Nhưng sau đó kỳ lạ bằng văn bản cho một mảng được tạo ra với zeros
đáng chú ý là chậm hơn so với một mảng được tạo ra với zeros_like
:
>>> timeit.timeit('x[100:-100, 100:-100] = 1', 'import numpy as np; x = np.zeros((12488, 7588, 3), np.uint8)', number = 10)
0.4310588836669922
>>> timeit.timeit('x[100:-100, 100:-100] = 1', 'import numpy as np; x = np.zeros_like(np.zeros((12488, 7588, 3), np.uint8))', number = 10)
0.33325695991516113
My đoán là zeros
đang sử dụng một số mẹo CPU và không thực sự ghi vào bộ nhớ để phân bổ nó. Điều này được thực hiện ngay lập tức khi nó được ghi vào. Nhưng điều đó vẫn không giải thích sự khác biệt lớn trong thời gian tạo mảng.
Tôi đang chạy Mac OS X Yosemite với phiên bản hiện tại NumPy:
>>> numpy.__version__
'1.9.1'
'số không' sử dụng' memset'; 'zeros_like' dường như có hiệu quả làm một' điền' mà làm một tấn vô nghĩa. Tôi đã cố gắng đuổi theo việc thực hiện thực tế nhưng nó không cần thiết. – Veedrac
'số không' không sử dụng memset. –