Pyyty - CPython'u nasıl yenebilir?


264

Gönderen Google'ın Açık Kaynak Blog :

PyPy, CPython'dan daha iyi performans elde etmek için gelişmiş teknikler kullanan Python'daki Python'un yeniden uygulanmasıdır. Uzun yıllar süren sıkı çalışma nihayet işe yaradı. Hız sonuçlarımız genellikle, biraz daha yavaş olmaktan, gerçek uygulama kodunda 2 kata kadar hızlanmaya, küçük ölçütlerde 10 kata kadar hızlanmaya kadar değişen CPython'u yener.

Bu nasıl mümkün olabilir? PyPy'yi uygulamak için hangi Python uygulaması kullanıldı? CPython ? Ve bir PyPyPy veya PyPyPyPy'nin puanlarını geçme şansı nedir?

(İlgili bir notta ... neden böyle bir şey denesin ki?)


43
Nitpick: PyPy , PyPyPy'dir. Py- * önekini bir projeksiyon operatörü olarak düşünün.
u0b34a0f6ae

Tamam. bu yüzden PyPy, CPython'a mı tercih edilmeli? herhangi bir dezavantajı var mı?
balki

10
PyPy, çalışma zamanı optimizasyonunda mükemmeldir, ancak farklı iç kısımları onu birkaç popüler C uzantısıyla uyumsuz hale getirir .
Cees Timmerman

4
Hız kazancının KURAMSAL OLARAK nasıl mümkün olduğu konusunda neredeyse herkes soruyu kaçırıyor. Ama bir düşünün: Python bir Turing makinesi gibi her şeyi yapabilir. Sonuçta arayabilir gcc. Böylece, CPython üzerinde çalışan, diğer bazı python kodlarını yorumlayan, C'ye çeviren ve yürüten gccve ardından derlenen programı yürüten bazı python kodları yazabilirsiniz . Ve kod yeterince sık çağrılırsa daha hızlı olabilir.
osa

Yanıtlar:


155

S1. Bu nasıl mümkün olabilir?

Manuel bellek yönetimi (CPython'un sayımı ile yaptığı şey) bazı durumlarda otomatik yönetimden daha yavaş olabilir.

CPython yorumlayıcısının uygulanmasındaki sınırlamalar, PyPy'nin yapabileceği bazı optimizasyonları (örn. İnce taneli kilitler) engeller.

Marcelo'nun belirttiği gibi, JIT. Anında bir nesnenin türünü teyit etmek, nihayet aramak istediğiniz yönteme ulaşmak için birden fazla işaretçi dereferences yapma ihtiyacını koruyabilir.

S2. PyPy'yi uygulamak için hangi Python uygulaması kullanıldı?

PyPy yorumlayıcısı, Python'un statik olarak yazılan bir alt kümesi olan RPython'da uygulanır (CPython yorumlayıcısı değil, dil). - Ayrıntılar için https://pypy.readthedocs.org/en/latest/architecture.html adresine bakın .

Q3. Ve bir PyPyPy veya PyPyPyPy'nin puanlarını geçme şansı nedir?

Bu, bu varsayımsal tercümanların uygulanmasına bağlı olacaktır. Bunlardan biri örneğin kaynağı aldı, üzerinde bir tür analiz yaptı ve bir süre çalıştıktan sonra doğrudan sıkı hedefe özel montaj koduna dönüştürdüyse, CPython'dan oldukça hızlı olacağını hayal ediyorum.

Güncelleme: Son zamanlarda, özenle hazırlanmış bir örnekte , PyPy, derlenmiş benzer bir C programından daha iyi performans gösterdi gcc -O3. Bu anlaşmalı bir durum ama bazı fikirler sergiliyor.

S4. Neden böyle bir şey denesin ki?

Resmi siteden. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

Amacımız:


  • dinamik dil uygulamaları üretmek için ortak bir çeviri ve destek çerçevesi ,
    dil spesifikasyonu ve uygulama
    yönleri arasında temiz bir ayrım olduğunu vurgulamaktadır . Buna RPython toolchain_ diyoruz .

  • düşük seviye ayrıntıları kodlamak zorunda kalmadan yeni gelişmiş yüksek seviye özellikleri sağlamak için yukarıdaki araç zincirini kullanan Python_ Dilinin uyumlu, esnek ve hızlı bir uygulaması.

Endişeleri bu şekilde ayırarak, Python ve diğer dinamik dilleri uygulamamız herhangi bir dinamik dil için otomatik olarak Tam Zamanında bir derleyici oluşturabilir. Ayrıca, hedef platform, bellek ve iş parçacığı modelleri, çöp toplama stratejileri ve uygulanmış olsun ya da olmasın da dahil olmak üzere uygulanan optimizasyonlar gibi geçmişte bir kullanıcının kontrolünün dışında olan pek çok dahil olmak üzere uygulama kararlarında karma ve eşleştir yaklaşımına izin verir. ilk etapta bir JIT.

C derleyici gcc C, Haskell derleyici GHC Haskell yazılmış. Python yorumlayıcısının / derleyicisinin Python'a yazılmaması için herhangi bir nedeniniz var mı?


82
Bu cevap PyPy'nin ne kadar hızlı olduğuna dair ana açıklamayı tamamen kaçırıyor; PyPy'nin gerçekten Python'da değil, RPython'da uygulandığından bahsederken, RPython kodunun PyPy yorumlayıcısını üretmek için statik olarak derlendiğini ve optimize edildiğini göstermez (sadece üstte çalışabilen geçerli Python kodu da olur çok daha yavaş). "Normal Python" da uyguladıkları, RPython "derleyicisi" dir (blok alıntıda atıfta bulunulan çeviri çerçevesi).
Ben

12
Bu lede gömüyor. Performansın çoğu, çeviriden C'ye (yorumlayıcıyı CPython'dan çok daha yavaş yapmaz) ve sıcak yolları çok daha hızlı hale getiren JIT'e gelir.
Tobu

4
"Güncelleme: Son zamanlarda, özenle hazırlanmış bir örnekte PyPy, gcc -O3 ile derlenen benzer bir C programından daha iyi performans gösterdi." Ve bu yazının altındaki ilk yorumu okursanız, bu yazının yazarının bağlantı zamanı optimizasyonunu bilmediğini göreceksiniz. Bağlantı zamanı optimizasyonu etkinleştirildiğinde, C kodu daha hızlı çalışır.
Ali

2
Blog yazısı 2011'de ve bu cevap 2014'te oldu. Ayrıca, yorum paylaşılan kütüphanelerden bahsediyor. Bunun ne kadarının (cevap ve blog yazısı) geçerli olduğunu bilmiyorum. İlgili tüm teknolojiler son birkaç yılda çok değişti.
Noufal Ibrahim

1
Dikkatle hazırlanmış iki Pypy örneğinin eşdeğer C'den daha hızlı olması durumunda, her biri çok özel nedenlerle kıyaslama açısından daha hızlıdır. Birincisi, Pypy hiçbir şey kullanılmayan sıkı döngü sayımını gerçekleştirmek için yeterince akıllı olduğundan, aşağıdakilerin bir kombinasyonu için tamamen (JIT geçişi) silinebilir: çünkü Pypy JIT verilen "kütüphane sınırları boyunca satır içi" olabilir "printf" işlevinin örneği, kelimenin tam anlamıyla yalnızca bir tamsayı yayabilme özelliğine sahiptir ve yinelenen arızaları (bellek ayırma yükü) ortadan kaldırır.
amcgregor

291

"PyPy teknik olarak doğru olmasına rağmen, Python Python içinde bir yeniden uygulama" PyPy, IMHO tanımlamak için oldukça yanıltıcı bir yoldur.

PyPy'nin iki önemli kısmı vardır.

  1. Çeviri çerçevesi
  2. Çevirmen

Çeviri çerçevesi bir derleyicidir. Çöp toplama ve JIT derleyicisi gibi yönleri otomatik olarak ekleyerek RPython kodunu C'ye (veya diğer hedeflere) derler . O olamaz keyfi Python kodunu, sadece RPython işlemek.

RPython, normal Python'un bir alt kümesidir; tüm RPython kodu Python kodudur, ancak tam tersi değildir. RPython'un resmi bir tanımı yoktur, çünkü RPython temel olarak sadece "PyPy'nin çeviri çerçevesi tarafından çevrilebilen Python'un alt kümesidir". Ancak çevrilmek için RPython kodu statik olarak yazılmalıdır (türler çıkarılır, bunları beyan etmezsiniz , ancak yine de değişken başına kesinlikle bir türdür) ve işlevleri bildirme / değiştirme / ya da çalışma zamanında.

Yorumlayıcı RPython ile yazılmış normal bir Python yorumlayıcısıdır.

RPython kodu normal Python kodu olduğundan, herhangi bir Python yorumlayıcısında çalıştırabilirsiniz. Ama PyPy'nin hız iddialarının hiçbiri onu bu şekilde çalıştırmaktan gelmiyor; bu sadece hızlı bir test döngüsü içindir, çünkü tercümanı çevirmek uzun zaman alır .

Bu anlaşıldığında, PyPyPy veya PyPyPyPy hakkındaki spekülasyonların aslında bir anlamı olmadığı hemen anlaşılmalıdır. RPython ile yazılmış bir tercümanınız var. Python'u hızlı bir şekilde çalıştıran C koduna çevirirsiniz. Burada süreç durur; tekrar işleyerek hızlanacak başka RPython yok.

Peki "PyPy'nin CPython'dan daha hızlı olması nasıl mümkün" de oldukça açık hale geliyor. PyPy, bir JIT derleyicisi de dahil olmak üzere daha iyi bir uygulamaya sahiptir (genellikle JIT derleyicisi olmadan o kadar hızlı değildir, bu da PyPy'nin sadece JIT derlemesine duyarlı programlar için daha hızlı olduğu anlamına gelir). CPython hiçbir zaman Python dilinin son derece optimize edilmiş bir uygulaması olarak tasarlanmamıştır (ancak farkı izlerseniz bunu oldukça optimize edilmiş bir uygulama yapmaya çalışırlar ).


PyPy projesinin gerçekten yenilikçi kısmı, karmaşık GC şemalarını veya JIT derleyicilerini elle yazmamalarıdır. Tercümanı RPython'da nispeten basit bir şekilde yazarlar ve tüm RPython Python'dan daha düşük seviyededir, hala nesne yönelimli bir çöp toplanmış dildir, C'den çok daha yüksektir. Daha sonra çeviri çerçevesi otomatik olarak GC ve JIT gibi şeyler ekler. Çeviri çerçevesi çok büyükancak PyPy python yorumlayıcısı için eşit derecede geçerlidir, ancak uygulamalarını değiştirerek performansı iyileştirmek için deneylerde çok daha fazla özgürlüğe izin verir (GC hatalarını tanıtmak veya JIT derleyicisini değişikliklerle başa çıkmak için güncellemeksizin). Ayrıca, bir Python3 yorumlayıcıyı kullanmaya başladıklarında otomatik olarak aynı faydaları elde edecekleri anlamına gelir. Ve PyPy çerçevesiyle yazılmış diğer çevirmenler (lehçenin değişen aşamalarında bir sayı vardır). Ve PyPy çerçevesini kullanan tüm tercümanlar, çerçevenin desteklediği tüm platformları otomatik olarak destekler.

Bu nedenle, PyPy projesinin gerçek yararı, dinamik bir dil için verimli bir platformdan bağımsız yorumlayıcı uygulamanın tüm bölümlerini (mümkün olduğunca) ayırmaktır. Ve sonra, birçok tercümanda tekrar kullanılabilecek tek bir yerde iyi bir uygulama geliştirin. Bu "Python programım şimdi daha hızlı çalışıyor" gibi acil bir kazanç değil, ama gelecek için büyük bir olasılık.

Ve Python programınızı daha hızlı çalıştırabilir (belki).


4
Farkı takip edemedim :(
polvoazul

37
@polvoazul Optimize edilmiş bir dil uygulaması ile optimize edici bir dil arasındaki fark nedir? CPython'un iyi optimize edilmiş bir uygulama olduğunu söylediğimde, geliştiricilerin yorumlayıcının kendisinin iç algoritmalarını yapmaya çalıştıklarını ve yerleşik veri yapılarının verimli çalıştıklarını kastediyorum. Bir optimize uygulanması, OTOH, analiz edeceğini son kullanıcılar kodunu ve daha verimli çalıştırmak için onu dönüştürmek için yollar dışında rakam deneyin.
Ben

23

PyPy Python'da uygulanır, ancak anında yerel kod üretmek için bir JIT derleyicisi uygular.

PyPy'yi Python'un üzerine uygulamanın nedeni, özellikle JIT derleyicisinin ana bilgisayar dilinin performansını bir şekilde alakasız hale getirmesi nedeniyle, muhtemelen çok verimli bir dil olmasıdır.


JIT, PyPy ile aynı düzeyde çalışan Python kodu oluşturuyor mu veya PyPy'nin hangi Python uygulaması üzerinde çalışıyorsa gerçek yerel kod üretiyor mu?
Edmund

3
Gerçek yerel kod ( buraya bakın ); 32 bit x86 kodu kesin.
Marcelo Cantos

11

PyPy Kısıtlı Python ile yazılmıştır. Bildiğim kadarıyla CPython yorumlayıcısının üstünde çalışmaz. Kısıtlı Python, Python dilinin bir alt kümesidir. AFPIK, PyPy yorumlayıcısı makine koduna derlenmiştir, bu yüzden kurulduğunda çalışma zamanında bir python yorumlayıcısı kullanmaz.

Sorunuz, kod yürütülürken PyPy yorumlayıcısının CPython'un üstünde çalışmasını bekliyor gibi görünüyor. Düzenleme: Evet, PyPy kullanmak için önce PyPy python kodunu ya C'ye çevirir ve gcc ile jvm bayt koduna ya da .Net CLI koduna dönüştürürsünüz. Bkz. Başlarken


8
PyPy, CPython'un üstünde çalışacak, ancak bu modda bir kişinin arzu edebileceği hız kazanımlarını sağlamıyor. :-) codespeak.net/pypy/dist/pypy/doc/…
Frank V
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.