Saya akan mencoba menjawab pertanyaan Anda mengingat Anda meminta Python secara khusus. Saya akan menjelaskan metode saya sendiri dalam mengatasi masalah simulasi. Strategi untuk simulasi yang lebih cepat diberikan dalam uraian ini.
Pertama, saya membuat prototipe simulasi baru dengan Python. Tentu saja, saya mencoba menggunakan NumPy dan SciPy sebanyak yang saya bisa. Sedangkan NumPy menyediakan tipe data array yang cocok untuk simulasi numerik, SciPy menawarkan berbagai rutinitas numerik yang bekerja dengan array NumPy.
Setelah prototipe berfungsi lebih atau kurang, saya mencoba mempelajari bagian mana dari program atau skrip yang menjadi penghambatnya. Ada beberapa kandidat untuk itu:
- Loop di Python lambat. Sangat lambat.
- Karena Python menggunakan mengetik bebek , fungsi panggilan bisa lambat.
Saya menggunakan strategi pembuatan profil sederhana untuk mempelajari di mana semua waktu yang digunakan dihabiskan. Menggunakan shell IPython (yang saya tidak bisa merekomendasikan cukup), saya menjalankan skrip saya dengan
%timeit script.py
"Perintah ajaib" ini akan melakukan pembuatan profil (menggunakan timeit ) untuk Anda dan memberi Anda daftar dengan waktu setelah skrip Anda dihentikan. Gunakan daftar ini untuk mencari tahu di mana kode Anda terlalu lambat.
Setelah Anda menemukan bagian-bagian yang perlu dipercepat, Anda dapat mempertimbangkan menggunakan bahasa yang dikompilasi. Saya akan menunjukkan dua solusi.
Pertama, ada bahasa Cython . Cython adalah bahasa pemrograman yang sangat mirip dengan Python (pada kenyataannya, kode Python sering juga merupakan kode Python yang valid); Namun, kompiler Cython mengubah file Cython menjadi kode C, yang kemudian dapat dikompilasi menjadi modul yang dapat digunakan dari Python. Cython memahami array NumPy. Ada dua cara di mana menggunakan Cython dapat membantu Anda: pertama, Anda dapat memperkenalkan tipe data. Ini akan mempercepat panggilan fungsi. Juga, jika Anda mengulangi lebih dari array, loop Anda akan berjalan lebih cepat (pada kenyataannya, jika Anda mengetik variabel dummy dan array, Anda mendapatkan loop C polos!). Kedua, dalam percobaan saya, bahkan skrip yang tidak diketik berjalan sedikit lebih cepat karena fakta bahwa mereka dikompilasi bukannya ditafsirkan.
Bahasa kompilasi lain yang akan berguna bagi Anda adalah Fortran. Ada berbagai cara untuk menggunakan Fortran dengan Python ( f2py , fortwrap , Cython ). Bagi saya pribadi f2py tampaknya menjadi cara termudah, saya akan segera menjelaskan apa fungsinya. f2py dapat mengkompilasi kode Fortran ke modul Python. Ini akan memungkinkan Anda untuk menggunakan array NumPy sebagai variabel input dan output dari ruang Python. Di ruang Fortran, ini akan menjadi array Fortran biasa. Anda dapat beroperasi pada kecepatan penuh Fortran.
Secara pribadi, saya cenderung menggunakan Cython di mana jumlah pemanggilan fungsi adalah bottleneck. Untuk hal-hal yang berat, saya lebih suka f2py (mungkin karena saya memiliki latar belakang Fortran yang kuat).
Pada catatan tambahan tentang Fortran: Fortran modern membaca dan menulis sangat mirip dengan NumPy - sintaksinya sangat dekat. Ini membuatnya mudah untuk mengkonversi kode NumPy ke kode Fortran.
Perhatikan bahwa Cython dan f2py mendukung paralleisme dalam beberapa cara. Untuk Cython, Anda akan menemukan bantuan di sini , sedangkan untuk Fortran, ada teknik standar seperti OpenMP atau MPI. Selain itu, ada pembungkus P ython untuk MPI juga. Secara pribadi, saya menggunakan mpi4py di tingkat Python dan juga OpenMP di Fortran.
Izinkan saya merekomendasikan sedikit literatur: buku Python Scripting For Computational Science oleh H.-P. Langtangen adalah sumber yang bagus untuk Python secara umum dan juga strategi untuk membuat Python sedikit lebih cepat. Sayangnya, AFAIR, tidak menyebutkan apa pun di Cython. Saat saya sumber kedua, Anda dapat melihat slide ini . Ini memberikan contoh untuk semua yang saya sebutkan di posting ini (lihat juga kode dan sumber di sini ). Ada banyak set slide lain yang bagus di internet.
Jika Anda memiliki pertanyaan yang lebih spesifik, kami semua dengan senang hati membantu!