Được cung cấp thread hereTại sao numpy là 'chậm' của chính nó?
Dường như không phải là lý tưởng nhất để tính toán cực nhanh. Có ai biết những gì trên đầu chúng ta phải nhận thức được khi sử dụng numpy để tính toán số?
Được cung cấp thread hereTại sao numpy là 'chậm' của chính nó?
Dường như không phải là lý tưởng nhất để tính toán cực nhanh. Có ai biết những gì trên đầu chúng ta phải nhận thức được khi sử dụng numpy để tính toán số?
Vâng, tùy thuộc vào những gì bạn muốn làm. XOR là, ví dụ, hầu như không có liên quan cho một ai đó quan tâm đến việc thực hiện đại số tuyến tính số (mà numpy là khá nhanh, nhờ sử dụng tối ưu hóa BLAS/LAPACK thư viện bên dưới).
Nói chung, ý tưởng lớn đằng sau việc đạt được hiệu suất tốt từ sự cố định là để phân bổ chi phí của thông dịch viên qua nhiều yếu tố cùng một lúc. Nói cách khác, di chuyển các vòng từ mã python (chậm) vào vòng lặp C/Fortran ở đâu đó trong numpy/BLAS/LAPACK/etc. internals (nhanh). Nếu bạn thành công trong hoạt động đó (gọi là véc tơ) hiệu suất thường sẽ khá tốt.
Tất nhiên, bạn rõ ràng có thể có hiệu suất tốt hơn bằng cách bán thông dịch viên trăn và sử dụng, thay vào đó, C++. Cho dù phương pháp này thực sự thành công hay không phụ thuộc vào việc bạn giỏi lập trình hiệu suất cao với C++ so với numpy và hoạt động chính xác nào bạn đang cố gắng làm.
tôi có thể không thực sự nói, nhưng tôi đoán có hai yếu tố:
lẽ NumPy được sao chép thứ hơn? dệt thường nhanh hơn khi bạn tránh phân bổ các mảng tạm thời lớn, nhưng điều này không quan trọng ở đây.
numpy có một ít chi phí được sử dụng trong việc lặp qua các mảng đa chiều (có thể). Chi phí này thường sẽ bị suy giảm bởi số crunching, nhưng một xor thực sự thực sự nhanh chóng, vì vậy tất cả những gì thực sự quan trọng là chi phí.
Bất cứ lúc nào bạn có một biểu hiện như x = a * b + c/d + e
, bạn kết thúc với một mảng tạm a * b
, một mảng tạm c/d
, một cho một trong những khoản tiền và cuối cùng là một phân bổ cho kết quả. Đây là một hạn chế của các kiểu Python và quá tải toán tử. Tuy nhiên, bạn có thể làm mọi thứ một cách rõ ràng bằng cách sử dụng các toán tử tăng cường (*=
, +=
, v.v.) và đảm bảo rằng các bản sao không được thực hiện.
Vì lý do cụ thể, NumPy thực hiện chậm hơn trong tiêu chuẩn đó, thật khó để nói nhưng có thể phải làm với chi phí liên tục kiểm tra kích thước, loại-marshaling, vv mà Cython/etc. không phải lo lắng. Về những vấn đề lớn hơn, bạn có thể thấy nó gần hơn.
Câu hỏi phụ của bạn: a = sin (x), có bao nhiêu vòng ở đó.
Bí quyết là chuyển một mảng cố định đến sin (x), sau đó chỉ có một 'khứ hồi' cho toàn bộ mảng, vì vần sẽ trả về một mảng các giá trị sin. Không có python cho vòng lặp tham gia vào hoạt động này.
Tôi đồng ý rằng sau khi dữ liệu được chuyển đến bên fortran, nó sẽ nhanh chóng. Tôi quan tâm nhiều hơn đến giao diện mã trăn/biên dịch trên đầu. nói dòng 'a = sin (x)' dữ liệu đã trải qua một chuyến đi vòng từ python đến C. Tôi muốn biết có bao nhiêu lớp trên đầu nó đã trải qua và nếu chuyển mã này sang cython sẽ làm tốt hơn nhiều. – leon