PYPY

2013-06-27 20 views
7

için optimize Ben PYPY altında bazı Python kodu çalıştırıyorum ve bunu optimize etmek istiyorumPYPY

(Bu Statistical profiler for PyPy için bir takip olduğunu).

Python'da, hangi satırların yavaşlama işlemine neden olduğunu öğrenmek ve etraflarında dolaşmaya çalışmak için statprof veya lineprofiler kullanırım. Ancak PyPy'de, her iki araç da PyPy'nin bazı satırları en iyi duruma getirebileceği gibi hassas sonuçlar vermez. Ayrıca, rapor edilen fonksiyonun hangi kısmının tıkanıklık olduğunu çok zor bulmam için cProfile'u kullanmayı tercih etmem.

Nasıl devam edeceğiniz konusunda bazı ipuçları var mı? PyPy'nin altında güzelce çalışan bir başka profiler olabilir mi? Genel olarak, PyPy için Python kodunun optimizasyonu nasıl yapılır?

cevap

5

PyPy mimarisinin çalışma şeklini anlarsanız, kod satırlarının tek tek işaretlenmeye çalışılmasının gerçekten üretken olmadığını anlayacaksınız. RPython'da yazılan bir Python yorumlayıcısından başlıyorsunuz, daha sonra akış grafikleri oluşturan bir izleme JIT'si üzerinden geçiyor ve sonra bu grafikleri RPython yorumlayıcısını optimize etmek için dönüştürüyor. Bunun anlamı, JIT'ed olan RPython yorumlayıcısı tarafından çalıştırılan Python kodunuzun düzeninin, optimize edilmiş bir araya getiriciden çok farklı bir yapıya sahip olabileceği anlamına gelir. Dahası, JIT'in her zaman bir döngüde veya bir işlevde çalıştığını unutmayın, bu yüzden satır içi istatistikler anlamlı değildir. Sonuç olarak, sizin için optimizasyonunuzu nereye konsantre edeceğiniz konusunda fikir vereceğinden, cProfile'un sizin için iyi bir seçenek olabileceğini düşünüyorum. Hangi işlevlerin darboğazlar olduğunu öğrendikten sonra, tek bir Python kod satırı düzeltmek yerine, daha yavaş işlevleri hedefleyen optimizasyon çabalarınızı harcayabilirsiniz.

Bunu yaptığınız gibi, PyPy'nin cPython'dan çok farklı performans özelliklerine sahip olduğunu unutmayın. Her zaman mümkün olduğunca basit bir şekilde kod yazmayı deneyin (bu mümkün olduğunca az satır btw anlamına gelmez). Özel listelerin kullanılması gibi yardımcı olan, çoğunlukla sabit tuşların az sayıda olduğu durumlarda dicts üzerinden nesnelerin kullanılması, C Python API'sı kullanılarak C uzantılarından kaçınmanız gibi birkaç başka buluşsal yöntem vardır.

Gerçekten ısrar ediyorsanız hat seviyesinde optimize etmeye çalışıyor. Birkaç seçenek var. Bunlardan biri JITViewer (https://bitbucket.org/pypy/jitviewer), JIT'in kodunuza neler yaptığını çok düşük seviyede görmenize izin verecek. Örneğin, bir Python döngüsüne karşılık gelen assembler talimatlarını bile görebilirsiniz. Bu aracı kullanarak, PyPy'nin kodun belirli bölümleri ile ne kadar hızlı davrandığını gerçekten anlayabilirsiniz, zira artık döngü veya bir şey için kullanılan assembler komutlarının sayısını saymak gibi aptalca şeyler yapabilirsiniz.

+0

Öneriniz nedir? –

+1

Benim önerim, sadece PyPy'nin nasıl çalıştığını göz önüne alarak cProfile kullanmaktı. İkinci önerim JitViewer'ı kullanmaktı, eğer gerçekten kodunuzun performans özelliklerine dair düşük seviyeli bir anlayışa ihtiyacınız varsa. – jlund3

+1

Akış grafikleri dönüştürmeleri, yorumlayıcıyı uygulayan RPython kodunu derlerken ve optimize ederken uygulanır, * Python kodunuz değil. Bu dönüşümler, C derleyicinin CPython yorumlayıcısının C kodu için uyguladığı dönüşümlerin karşılığıdır ve son kullanıcının Python koduyla ilgisi yoktur. PyPY'nin JIT'si, bahsettiğiniz problemi ortaya koymaktadır; Sıcak döngüler, birden çok farklı montaj kodu bloğuna JIT-derlenmiş olacaklardır, bu da performansı Python ifadelerinin bireysel olarak geri almasını zorlaştırır. – Ben

İlgili konular