2 Câu hỏi: Tối ưu hóa numpy.dot với Cython

câu hỏi được tạo ra tại Sun, Jun 24, 2012 12:00 AM

Tôi có đoạn mã sau mà tôi muốn tối ưu hóa bằng Cython:

 49 310

Tôi đã viết và biên dịch tệp .pyx và khi tôi chạy mã, tôi không thấy bất kỳ cải thiện đáng kể nào về hiệu suất. Theo tài liệu Cython tôi phải thêm c_types. Tệp HTML được tạo bởi Cython chỉ ra rằng nút cổ chai là các sản phẩm dấu chấm (tất nhiên là được mong đợi). Điều này có nghĩa là tôi phải xác định hàm C cho các sản phẩm chấm? Nếu có, làm thế nào để tôi làm điều đó?

CHỈNH SỬA:

Sau một số nghiên cứu, tôi đã đưa ra đoạn mã sau. Sự cải thiện chỉ là cận biên. Tôi không chắc chắn nếu có điều gì tôi có thể làm để cải thiện nó:

 49 310     
9
  1. Hãy xem câu hỏi rất giống gần đây này: stackoverflow.com/questions/10772513/power-spectrum-with-cython/trộm
    2012-05-28 18: 17: 16Z
2 Câu trả lời                              2                         

Như một lưu ý chung, nếu bạn đang gọi các hàm numpy từ bên trong cython và làm ít việc khác, bạn thường sẽ chỉ thấy lợi nhuận cận biên nếu có. Nói chung, bạn chỉ nhận được các tốc độ tăng tốc lớn nếu bạn đang nhập mã tĩnh sử dụng một vòng lặp rõ ràng ở cấp độ python (không phải trong một cái gì đó đang gọi Numpy C-API).

Bạn có thể thử viết mã cho một sản phẩm dấu chấm bằng tất cả các kiểu gõ tĩnh của bộ đếm, các mảng numpy đầu vào, v.v., với hàm bao và giới hạn được đặt thành Sai, nhập phiên bản clib của hàm 49 310 tận dụng song song cho vòng lặp (49 310) để sử dụng openmp.

    
12
2012-05-29 02: 47: 34Z
  1. Đó là những gì tôi phát hiện ra cho đến nay. Tôi sẽ thử đề xuất của bạn. Cảm ơn
    2012-05-29 01: 32: 01Z
  2. Có thể tôi đã hiểu nhầm nhận xét của bạn. Bạn có gợi ý rằng mã của tôi không thể được tạo nhanh hơn với Cython không hoặc bạn có nghĩa là nếu tôi chỉ sử dụng mã Cython đã biên dịch mà không có bất kỳ thao tác gõ tĩnh nào thì tôi sẽ không đạt được? Xin vui lòng, hãy xem mã sửa đổi của tôi trong câu hỏi! Tôi không chắc đó có phải là cách tôi phải làm không.
    2012-05-29 10: 19: 30Z
  3. @ GeorgeEracleous điều tôi đang cố nói là mã ban đầu của bạn có tên 49 310 từ trong cython không mong muốn tăng tốc độ lớn. Mã mới mà bạn đã đăng giống như những gì tôi đang tưởng tượng đang cố gắng. Chỉ cần một vài lưu ý (1) Tôi không chắc liệu triển khai 49 310 của bạn có phải là ứng cử viên tốt cho nội tuyến hay không. (2) Vì bạn đang lặp qua một mảng gọn gàng, tôi khuyên bạn nên sử dụng các trang trí 49 310 và 49 310 và đặt chúng thành 49 310. (3) Trong tệp setup.py của bạn, đảm bảo bạn đang sử dụng các cờ tối ưu hóa (ví dụ: 49 310).
    2012-05-29 11: 18: 08Z
  4. Nói chung, 49ump của numpy sẽ được tối ưu hóa cao nếu được biên dịch theo BLAS hoặc MKL
    2012-05-29 11: 20: 36Z

Bạn có thể thay đổi biểu thức

 49 310

đến

 49 310     
0
2012-05-28 17: 18: 24Z
  1. Này, bạn nói đúng. Tôi nên nhận thấy rằng. Tuy nhiên, tôi đã thử nó và stisẽ không có cải thiện đáng kể! Nhưng vấn đề là quản lý để chạy cái này trong cython anw
    2012-05-28 17: 23: 06Z
sim = numpy.dot(v1, v2) / (sqrt(numpy.dot(v1, v1)) * sqrt(numpy.dot(v2, v2))) 
dist = 1-sim
return dist
nguồn đặt đây