Cevabımı üç bölüme ayıracağım. Profil oluşturma, python kodunu c ile hızlandırma ve python ile python hızlandırma. Benim görüşüme göre Python, kodunuzun performansının ne olduğuna ve daha sonra gerçek şişe boğumuna indiği şeylere bakmak için en iyi araçlara sahip. Profil oluşturmadan kodu hızlandırmak, uzi ile bir geyiği öldürmeye çalışmak gibi bir şey.
Gerçekten sadece mat-vec ürünleriyle ilgileniyorsanız, scipy.sparse'yi tavsiye ederim .
Profil oluşturma için Python araçları
profile ve cProfile modülleri : Bu modüller size standart çalışma süresi analizi ve işlev çağrısı yığını verir. İstatistiklerini kaydetmek ve pstats modülünü kullanarak verilere çeşitli şekillerde bakmanız oldukça hoş.
kernprof : bu araç, satır kodu zamanlamasına göre satır gibi şeyler yapmak için birçok yordamı bir araya getirir
memory_profiler : Bu araç kodunuzu yazdırmak için satır satır hafıza ayak üretir.
IPython zamanlayıcılar :timeit
İşlev, işlev farklılıklarını hızlı ve etkileşimli bir şekilde görmek için oldukça iyidir.
Python'u hızlandırmak
Cython : cython , python'da birkaç işlevi almanın ve daha hızlı kod almanın en hızlı yoludur. Fonksiyonu python'un cython varyantı ile dekore edebilirsiniz ve c kodunu oluşturur. Bu çok bakımsızdır ve ayrıca c / c ++ / fortran ile yazılmış kodlara kolayca bağlanabilir. Günümüzde tercih edilen bir araçtır.
ctypes : ctypes, işlevlerinizi c'ye yazmanıza ve daha sonra kodun sade dekorasyonu ile hızlı bir şekilde sarmanıza olanak sağlar. PyObjects'den oyuncu seçimi ve c işlevini çağırmak için gil'i yönetme tüm acısını işliyor.
Kodunuzu C'ye yazmak için başka yaklaşımlar var, ancak hepsi bir C / C ++ kitaplığı almak ve Python'a sarmak için biraz daha fazla.
Yalnızca Python yaklaşımları
Çoğunlukla Python'un içinde kalmak istiyorsanız tavsiyem, hangi verileri kullandığınızı ve algoritmalarınızı uygulamak için doğru veri türlerini seçmek. Veri yapılarınızı daha sonra herhangi bir düşük seviye hack'inden optimize ederek genellikle daha da ileriye gideceğinize dair deneyimim oldu. Örneğin:
numpy : dizilerin aşamalı işlemleri için çok hızlı bir koşullu dizi
numexpr : bir numpy dizi ifadesi iyileştiricisi. Çok okuyuculu numpy dizi ifadelerine izin verir ve Python yorumlayıcısının kısıtlamaları nedeniyle numpy'nin yaptığı sayısız geçici işlemden de kurtulur.
blist : Bir listenin b-ağacı uygulaması, bir listenin iç düğümlerini eklemek, indekslemek ve taşımak için çok hızlı
pandalar : veri çerçeveleri (veya tablolar) diziler üzerinde çok hızlı analitik.
pytables : hızlı yapılandırılmış hiyerarşik tablolar (hdf5 gibi), özellikle çekirdek hesaplama ve büyük veri sorgulamaları için iyi.