Tôi sẽ cố gắng trả lời câu hỏi của bạn xem xét rằng bạn đang yêu cầu Python cụ thể. Tôi sẽ mô tả phương pháp riêng của tôi để giải quyết một vấn đề mô phỏng. Các chiến lược cho mô phỏng nhanh hơn được đưa ra trong mô tả này.
Đầu tiên, tôi tạo nguyên mẫu mô phỏng mới trong Python. Tất nhiên, tôi cố gắng sử dụng NumPy và SciPy nhiều nhất có thể. Trong khi NumPy cung cấp một kiểu dữ liệu mảng phù hợp cho các mô phỏng số, SciPy cung cấp một thói quen số rộng làm việc với các mảng NumPy.
Một khi các nguyên mẫu hoạt động ít nhiều, tôi cố gắng tìm hiểu phần nào của chương trình hoặc tập lệnh là nút cổ chai. Có những ứng cử viên điển hình cho điều đó:
- Vòng lặp trong Python chậm. Rất chậm.
- Vì Python sử dụng kiểu gõ vịt , các chức năng gọi có thể bị chậm.
Tôi sử dụng một chiến lược định hình đơn giản để tìm hiểu nơi dành tất cả thời gian chạy. Sử dụng shell IPython (mà tôi không thể khuyên dùng đủ), tôi chạy tập lệnh của mình với
%timeit script.py
Này "kỳ diệu lệnh" sẽ làm profiling (sử dụng timeit ) cho bạn và giới thiệu bạn một danh sách với thời gian một lần kịch bản của bạn đã chấm dứt. Sử dụng danh sách này để tìm ra nơi mã của bạn quá chậm.
Khi bạn đóng đinh các phần cần được tăng tốc, bạn có thể xem xét sử dụng các ngôn ngữ được biên dịch. Tôi sẽ chỉ ra hai giải pháp.
Đầu tiên, đó là ngôn ngữ Cython . Cython là một ngôn ngữ lập trình rất giống với Python (trên thực tế, mã Python cũng thường là mã Python hợp lệ); tuy nhiên, trình biên dịch Cython chuyển đổi các tệp Cython thành mã C, sau đó có thể được biên dịch thành một mô-đun có thể sử dụng được từ Python. Cython hiểu mảng NumPy. Có hai cách sử dụng Cython có thể giúp bạn: đầu tiên, bạn có thể giới thiệu các loại dữ liệu. Điều này sẽ tăng tốc các cuộc gọi chức năng. Ngoài ra, nếu bạn lặp qua các mảng, vòng lặp của bạn sẽ chạy nhanh hơn (thực tế, nếu bạn nhập cả biến giả và mảng, bạn sẽ có một vòng lặp C đơn giản!). Thứ hai, trong các thử nghiệm của tôi, ngay cả các tập lệnh chưa được chạy cũng chạy nhanh hơn một chút do thực tế là chúng được biên dịch thay vì diễn giải.
Ngôn ngữ được biên dịch khác sẽ hữu ích cho bạn là Fortran. Có nhiều cách khác nhau để sử dụng Fortran với Python ( f2py , fortwrap , Cython ). Đối với cá nhân tôi, f2py dường như là cách dễ nhất, tôi sẽ nhanh chóng mô tả những gì nó làm. f2py có thể biên dịch mã Fortran thành các mô-đun Python. Nó sẽ cho phép bạn sử dụng mảng NumPy làm biến đầu vào và đầu ra từ không gian Python. Trong không gian Fortran, đây sẽ là các mảng Fortran thông thường. Bạn có thể hoạt động trên những người ở tốc độ Fortran đầy đủ.
Cá nhân, tôi có xu hướng sử dụng Cython trong đó số lần gọi hàm là nút cổ chai. Đối với những thứ nặng về vòng lặp, tôi thích f2py hơn (có thể vì tôi có nền tảng Fortran mạnh mẽ).
Về ghi chú bổ sung trên Fortran: Fortran hiện đại đọc và viết rất giống với NumPy - cú pháp rất gần. Điều này giúp dễ dàng chuyển đổi mã NumPy sang mã Fortran.
Lưu ý rằng cả Cython và f2py đều hỗ trợ paralleism theo một cách nào đó. Đối với Cython, bạn sẽ tìm thấy trợ giúp ở đây , trong khi đối với Fortran, có các kỹ thuật tiêu chuẩn như OpenMP hoặc MPI. Hơn nữa, có cả trình bao bọc P ython cho MPI , quá. Cá nhân, tôi sử dụng mpi4py ở cấp độ Python cũng như OpenMP trong Fortran.
Hãy để tôi giới thiệu một chút về văn học: cuốn sách Python Scripting For Computational Science của H.-P. Langtangen là một tài nguyên tuyệt vời trên Python nói chung cũng như về các chiến lược để làm cho Python nhanh hơn một chút. Thật không may, AFAIR, nó không đề cập bất cứ điều gì trên Cython. Khi tôi tài nguyên thứ hai, bạn có thể nhìn vào các slide này . Chúng đưa ra ví dụ cho tất cả mọi thứ tôi đã đề cập trong bài đăng này (xem thêm mã và nguồn ở đây ). Có rất nhiều bộ slide tốt khác trên internet.
Nếu bạn có câu hỏi cụ thể hơn, tất cả chúng tôi rất sẵn lòng giúp đỡ!