2010-04-15 26 views
6

Tôi đang có rất nhiều niềm vui học Python bằng cách viết một loại lập trình di truyền của ứng dụng.Tôi cần tăng tốc một chức năng. Tôi có nên sử dụng cython, ctypes hay cái gì khác không?

Tôi đã có một số lời khuyên tuyệt vời từ Torsten Marek, Paul Hankin và Alex Martelli trên trang web này.

Chương trình có 4 chức năng chính:

  • tạo (ngẫu nhiên) một cây biểu thức.
  • đánh giá sự phù hợp của cây
  • lai
  • đột biến

Như tất cả các tạo, lai và đột biến gọi 'đánh giá tập thể dục. nó là chức năng bận rộn nhất và là nút cổ chai chính theo chiều kim đồng hồ.

Như bản chất của thuật toán di truyền, nó phải tìm kiếm một không gian giải pháp bao la để nhanh hơn thì càng tốt. Tôi muốn tăng tốc từng chức năng này. Tôi sẽ bắt đầu với bộ đánh giá thể lực. Câu hỏi của tôi là cách tốt nhất để làm điều này là gì. Tôi đã nhìn vào cython, ctypes và 'liên kết và nhúng'. Họ là tất cả mới đối với tôi và khá xa hơn tôi vào lúc này nhưng tôi mong muốn học một và cuối cùng tất cả chúng.

'Chức năng thể dục' cần so sánh giá trị của cây biểu thức với giá trị của biểu thức mục tiêu. Vì vậy, nó sẽ bao gồm một bộ đánh giá postfix sẽ đọc cây theo thứ tự postfix. Tôi có tất cả các mã trong python.

Tôi cần lời khuyên mà tôi nên tìm hiểu và sử dụng ngay bây giờ: cython, ctypes hoặc liên kết và nhúng.

Cảm ơn bạn.

Trả lời

11

Bỏ qua câu trả lời của mọi người ngay bây giờ. Điều đầu tiên bạn nên học cách sử dụng là profiler. Python đi kèm với một hồ sơ/cProfile; bạn nên tìm hiểu cách đọc kết quả và phân tích đâu là nút cổ chai thực sự. Mục tiêu tối ưu hóa là ba lần: giảm thời gian sử dụng cho mỗi cuộc gọi, giảm số lượng cuộc gọi được thực hiện và giảm mức sử dụng bộ nhớ để giảm bớt sự cố đĩa.

Mục tiêu đầu tiên là tương đối dễ dàng. Trình lược tả sẽ hiển thị cho bạn các hàm tốn thời gian nhất và bạn có thể đi thẳng đến hàm đó để tối ưu hóa nó.

Mục tiêu thứ hai và thứ ba khó hơn vì điều này có nghĩa là bạn cần thay đổi thuật toán để giảm nhu cầu thực hiện quá nhiều cuộc gọi. Tìm các chức năng có số lượng cuộc gọi cao và cố gắng tìm cách giảm nhu cầu gọi cho họ. Sử dụng bộ sưu tập tích hợp sẵn, chúng được tối ưu hóa rất tốt.

Nếu bạn đã thực hiện tất cả những điều trên và vẫn gặp sự cố về hiệu suất và bạn đang ở trên nền tảng x86 (về cơ bản là hầu hết CPU), thì hãy bắt đầu xem Psyco. Psyco có thể tối ưu hóa một mã Python với sự cần thiết phải thay đổi mã python của bạn.

Nếu bạn đang thực hiện nhiều thao tác xử lý số và mảng, bạn nên xem qua các mô-đun bên thứ ba của Numpy/Scipy và gmpy.

Tiếp theo để thử là Cython. Cython là một ngôn ngữ hơi khác so với Python, trên thực tế Cython thực sự là C với cú pháp của Python.

Đối với các phần mã của bạn đang trong các vòng rất chặt chẽ mà bạn không còn có thể tối ưu hóa bằng bất kỳ cách nào khác, bạn có thể muốn viết lại dưới dạng phần mở rộng C. Python có hỗ trợ rất tốt để mở rộng với C.

+3

Khi bạn đang sử dụng hồ sơ của python hoặc cProfile, một điều tôi thấy thực sự thuận tiện và hữu ích là một công cụ visulising để cho tôi xem các con số được lập sơ đồ. Yêu thích của tôi là RunSnakeRun. Nó đòi hỏi wxPython và một vài phụ thuộc khác. Chạy nó trên đầu ra cProfile của bạn tạo ra một đồ thị GUI, nơi mỗi hàm được vẽ như một hình chữ nhật, có kích thước bằng thời gian (trung bình hoặc tích lũy) trong hàm đó, và bao quanh các rects cho các hàm mà nó gọi. Làm cho sự hiểu biết đầu ra profiler một cách dễ dàng. –

0

Một tùy chọn tuyệt vời khác là tăng cường :: python cho phép bạn dễ dàng quấn C hoặc C++.

Trong số các khả năng này, vì bạn có mã python đã được viết, cython có lẽ là một điều tốt để thử đầu tiên. Có lẽ bạn sẽ không phải viết lại bất kỳ mã nào để tăng tốc.

+0

Có, tôi đã nghe về nó. Nó có nghĩa là tôi phải học đủ c để viết các funcion trong đó, đó có lẽ là một ý tưởng hay. –

3

Cython là cách nhanh nhất để hoàn thành công việc, bằng cách viết thuật toán trực tiếp trong Cython hoặc bằng cách viết nó trong C và liên kết nó với python bằng Cython.

Lời khuyên của tôi: tìm hiểu Cython.

+0

cython hấp dẫn nhất đối với tôi, nhưng nó sẽ là nhanh nhất? –

0

Cố gắng làm việc chức năng thể dục của bạn để nó hỗ trợ ghi nhớ. Điều này sẽ thay thế tất cả các cuộc gọi trùng lặp với các cuộc gọi trước đó bằng tra cứu nhanh chóng.

Các vấn đề liên quan