Python'da yazılmış kodu hızlandırmak için hangi araçlar veya yaklaşımlar mevcut?


29

Amaç: MATL üstel-vektör ürünlerini MATLAB'den Python'a bir Krylov alt uzay yöntemi kullanarak hesaplayan bazı kodları taşımak isteyebileceğimi düşünüyorum. (Özellikle, bu makalede açıklanan bir algoritmayı kullanan Jitse Niesen'in expmvp işlevi .) Ancak derlenmiş kitaplıklardan türetilmiş modüllerden çok fazla işlev almadığım sürece (yani, yalnızca ham Python kullanıyorum ve çok fazla değil. işlevlerde), o zaman oldukça yavaş olabilir.

Soru: Performans için Python'da yazdığım kodu hızlandırmama yardımcı olacak araçlar veya yaklaşımlar nelerdir? Özellikle, genel yaklaşımlar memnuniyetle kabul edilse de, süreci mümkün olduğunca otomatikleştiren araçlarla ilgileniyorum.

Not: Jitse algoritmasının daha eski bir sürümüne sahibim ve bir süredir kullanmıyorum. Bu kodu hızlı bir şekilde yapmak çok kolay olabilirdi, ancak iyi bir somut örnek olacağını düşündüm ve kendi araştırmamla ilgili. Python'da bu özel algoritmayı uygulama yaklaşımımı tartışmak tamamen başka bir sorudur.


Bu soruya Python'a özgü bir cevap verdim: scicomp.stackexchange.com/questions/2429/… Buradaki ipuçlarının ve bağlantıların sizin için yararlı olacağını düşünüyorum.
AlexE

(Beni haberdar etmek için @AlexE h / t) Bu soru arasında kesinlikle bir örtüşme var, (nasıl) daha hızlı çalışan simülasyonlar yazmak? ve Kodumun seri performansını iyileştirmek için bazı iyi stratejiler nelerdir? . Bir çeşit birleşme olabilirdi. Bunun hakkında Meta'ya mesaj attım.
Geoff Oxberry

1
Buradaki iyi cevaplara ek olarak, bu bağlantıya bir göz atın .
Mike Dunlavey,

Yanıtlar:


40

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.


3
Fortran rutinlerini çağırmak için kripti de kullanabilirsiniz.
Matthew Emmett


Kod sarma hakkında konuşurken, ya f2py?
Astrojuanlu

f2py harika bir araçtır ve toplumdaki birçok kişi tarafından kullanılır. fwrap yaşını gösterdiği için fwrap daha yeni bir alternatif.
aterrel

Teşekkürler! Bunlar aradığım kaynaklar. Sadece bazılarının farkındaydım ve sadece geçerken (ya da internette onlara bakmaktan). Aron numexpr'den söz ediyor. Bu nasıl çalışıyor? Bu geçerli mi?
Geoff Oxberry

7

Öncelikle, eğer mevcut bir C veya Fortran uygulaması varsa (MATLAB MEX fonksiyonu?), Neden bir Python sarmalayıcısı yazmıyorsunuz?

Kendi uygulamanızı sadece bir sarıcı değil, aynı zamanda lineer cebir işleri için numpy modülünü kullanmanızı şiddetle tavsiye ederim. Optimize edilmiş bir blasla bağlandığından emin olun (ATLAS, GOTOblas, uBLAS, Intel MKL, ... gibi). Ve Cython veya dokuma kullanın. İyi bir tanıtım ve kıyaslama için bu Performance Python makalesini okuyun . Bu makaledeki farklı uygulamalar buradan indirebilirsiniz Travis Oliphant (Numpy-guru).

İyi şanslar.


Bu Performans Python makalesi biraz tarihli görünüyor, numexpr gibi mevcut olan yeni araçlardan bazılarından bahsetmiyor.
Aron Ahmadia

Ben gerçekten numexpr gözardı ettim. Aynı laplace benchmarkını numexpr ile çalıştırmak güzel olurdu ...
GertVdE

scipy.weavehala kullanılan ve geliştirilen? Performance Python makalesinin, kullanımın hızlı olabileceğini ve hızda oldukça iyi bir gelişme sağladığını gösteriyor ancak bu makalenin dışında çok nadir görüldüğünü gördüm.
Ken

@Ken: scipy.weave bildiğim kadarıyla artık aktif bir gelişim altında değil. Geriye dönük uyumluluk için tutuluyor ancak yeni projelerin Cython kullanması teşvik ediliyor.
GertVdE


4

Temel olarak diğer cevaplara katılıyorum. Hızlı sayısal pythonkod için en iyi seçenekler

  • Gibi özel kütüphaneler kullanın numpy
  • mevcut kodunuzu, python-programınızın doğrudan arayabilmesi için kaydırın

Fakat tüm algoritmayı sıfırdan programlamak istiyorsanız (alıntı yapıyorum: "sadece ham Python kullanıyorum") o zaman http://pypy.org/ 'nin bir JIT (Just In Time) uygulamasını düşünebilirsiniz python. Bunu projem için kullanamadım (çünkü dayanıyor numpyve pypyadamlar bunu desteklemeye çalışıyorlar) ancak kıyaslamalar oldukça etkileyici ( http://speed.pypy.org/ )


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.