Özellikle Python'u istediğini düşünerek sorunuzu cevaplamaya çalışacağım. Ben bir simülasyon problemiyle başa çıkma yöntemimi tarif edeceğim. Daha hızlı simülasyonlar için stratejiler bu açıklamada verilmiştir.
İlk olarak, Python'da yeni simülasyonları prototiplendiriyorum. Tabii ki, ben yararlanmak için denemek numpy ve SciPy ben mümkün olduğunca çok. NumPy, sayısal simülasyonlar için uygun bir dizi veri türü sunarken SciPy, NumPy dizileriyle çalışan geniş bir sayısal rutin sunar.
Prototipler az çok çalıştığında, programın veya komut dosyasının hangi bölümlerinin darboğaz olduğunu öğrenmeye çalışırım. Bunun için tipik adaylar var:
- Python'daki döngüler yavaş. Çok yavaş.
- Python ördek yazmayı kullandığından , arama işlevleri yavaş olabilir.
Tüm çalışma süresinin nerede harcandığını öğrenmek için basit bir profil oluşturma stratejisi kullanıyorum. IPython kabuğunu kullanarak (yeterince öneremiyorum) , betiğimi
%timeit script.py
Bu "sihirli komut" sizin için profil oluşturmayı ( timeit kullanarak ) yapar ve betiğiniz sona erdikten sonra size bir liste sunar. Kodunuzun çok yavaş olduğunu bulmak için bu listeyi kullanın.
Hızlanması gereken parçaları çiviledikten sonra, derlenmiş dilleri kullanmayı düşünebilirsiniz. İki çözüme işaret edeceğim.
İlk olarak Cython dili var. Cython, Python'a çok benzer bir programlama dilidir (aslında, Python kodu genellikle geçerli Python kodudur); ancak, Cython derleyicisi Cython dosyalarını C koduna dönüştürür ve bu kod daha sonra Python'dan kullanılabilen bir modüle dönüştürülebilir. Cython NumPy dizilerini anlar. Cython'u kullanmanın size yardımcı olabileceği iki yol vardır: ilk olarak, veri türlerini tanıtabilirsiniz. Bu işlev çağrılarını hızlandıracaktır. Ayrıca, diziler üzerinde yineleme yaparsanız, döngünüz daha hızlı çalışır (aslında, hem kukla değişkeni hem de diziyi yazarsanız, düz bir C döngüsü alırsınız!). İkincisi, deneylerimde, yorumlanmamış komut dosyaları bile yorumlanmak yerine derlendikleri için biraz daha hızlı çalışır.
Sizin için yararlı olacak diğer derlenmiş dil Fortran'dır. Fortran'ı Python ile kullanmanın farklı yolları vardır ( f2py , fortwrap , Cython ). Bana göre f2py en kolay yol gibi görünüyor, ne yaptığını çabucak anlatacağım. f2py Fortran kodunu Python modüllerine derleyebilir. NumPy dizilerini Python uzayından giriş ve çıkış değişkenleri olarak kullanmanızı sağlar. Fortran uzayında bunlar sıradan Fortran dizileri olacak. Bunları tam Fortran hızında çalıştırabilirsiniz.
Şahsen, Cython'u işlev çağrısı sayısının darboğaz olduğu yerlerde kullanma eğilimindeyim. Döngü-ağır şeyler için, f2py'yi tercih ederim (belki de güçlü bir Fortran geçmişim olduğu için).
Fortran hakkında ek not: modern Fortran, NumPy'ye çok benziyor ve yazıyor - sözdizimi çok yakın. Bu, NumPy kodunu Fortran koduna dönüştürmeyi kolaylaştırır.
Hem Cython hem de f2py'nin bir şekilde paralleizmi desteklediğini unutmayın. Cython için burada yardım bulacaksınız , Fortran için ise OpenMP veya MPI gibi standart teknikler var . Ayrıca, MPI için de P ython sarmalayıcıları vardır . Şahsen ben Fortran'da PMPhon düzeyinde mpi4py ve OpenMP kullanıyorum.
Biraz edebiyat tavsiye edeyim: H.-P.'nin Hesaplamalı Bilim İçin Python Scripting kitabı. Langtangen genel olarak Python ve Python'u biraz daha hızlı hale getirme stratejileri için harika bir kaynaktır. Ne yazık ki, AFAIR, Cython'da hiçbir şeyden bahsetmiyor. İkinci kaynak olarak bu slaytlara bakabilirsiniz . Bu yazı belirtilen her şey için bu vermek örnekleri (aynı zamanda kod ve kaynaklarını görmek burada ). İnternette slaytlar çok iyi bir dizi vardır.
Daha spesifik sorularınız varsa, yardımcı olmaktan memnuniyet duyarız!