Làm thế nào để hiệu suất của quy mô hoạt động mảng Python / Numpy với tăng kích thước mảng?


21

Làm thế nào để quy mô mảng Python / Numpy tăng kích thước mảng?

Điều này dựa trên một số hành vi mà tôi nhận thấy trong khi đo điểm chuẩn mã Python cho câu hỏi này: Làm thế nào để diễn tả biểu thức phức tạp này bằng cách sử dụng các lát cắt gọn gàng

Vấn đề chủ yếu liên quan đến việc lập chỉ mục để điền vào một mảng. Tôi thấy rằng những lợi thế của việc sử dụng các phiên bản Cython và Numpy (không tốt lắm) trên một vòng lặp Python khác nhau tùy thuộc vào kích thước của các mảng liên quan. Cả Numpy và Cython đều có lợi thế về hiệu suất tăng dần đến một điểm (đâu đó rộng khoảng cho Cython và cho Numpy trên máy tính xách tay của tôi), sau đó các ưu điểm của chúng bị giảm (chức năng Cython vẫn nhanh nhất).N= =500N= =2000

Phần cứng này có được định nghĩa không? Về mặt làm việc với các mảng lớn, các thực tiễn tốt nhất mà người ta nên tuân thủ đối với mã nơi hiệu suất được đánh giá cao là gì?

Cốt truyện về thời gian thực hiện liên quan đến mã lặp cho việc triển khai véc tơ và Cython

Câu hỏi này ( Tại sao không phải là tỷ lệ nhân vectơ ma trận của tôi? ) Có thể liên quan, nhưng tôi quan tâm đến việc biết thêm về cách xử lý các mảng khác nhau trong quy mô Python so với nhau.


Bạn đã thử numexpr chưa? Ví dụ, cũng có cuộc nói chuyện này chỉ ra bloscCArray , tất cả đều nhằm tăng tốc mọi thứ hơn nữa (và có thể bỏ qua các giới hạn băng thông bộ nhớ).
0 0

1
Bạn có thể gửi mã được sử dụng để hồ sơ. Có lẽ có một vài điều đang diễn ra ở đây.
meawoppl

Câu trả lời:


5

416kB

def timeit(size):
     t0 = time.time()
     for _ in xrange(10):
         np.random.random(size)
     return time.time() - t0

sizes = np.logspace(1, 6, 40)
times = [timeit(s) for s in sizes]

Có một vài điều sai với điểm chuẩn này, để bắt đầu, tôi không vô hiệu hóa bộ sưu tập rác và tôi đang lấy tiền, không phải là thời điểm tốt nhất, nhưng hãy chịu đựng tôi.

800064kB

Có nên lo lắng về kích thước bộ đệm? Theo nguyên tắc chung, tôi nói không. Tối ưu hóa cho nó trong Python có nghĩa là làm cho mã phức tạp hơn nhiều, để tăng hiệu suất đáng ngờ. Đừng quên rằng các đối tượng Python thêm một số chi phí khó theo dõi và dự đoán. Tôi chỉ có thể nghĩ về hai trường hợp đây là một yếu tố có liên quan:

  • Các hoạt động cơ bản trên các mảng lớn (như đánh giá một đa thức), bị giới hạn bởi băng thông bộ nhớ. Sử dụng Numexpr hoặc (nếu dữ liệu lớn hơn nhiều) Pytables . Chúng được tối ưu hóa để đưa kích thước bộ đệm vào tài khoản trong số các tối ưu hóa khác.
  • Hiệu suất mã quan trọng: nếu bạn muốn siết chặt mỗi micro giây, bạn không nên sử dụng Python ở nơi đầu tiên. Viết Cython vector hóa và rời khỏi trình biên dịch làm những gì nó làm tốt nhất có lẽ là cách không đau đớn để đi.

Trong các bình luận, Evert đã đề cập đến CArray. Lưu ý rằng, ngay cả khi làm việc, sự phát triển đã dừng lại và nó đã bị bỏ rơi như một dự án độc lập. Thay vào đó, chức năng sẽ được đưa vào Blaze , một dự án đang diễn ra để tạo ra một "Numpy thế hệ mới".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.