Python neden modern Javascript uygulamaları gibi optimize edilmedi?


11

V8 (Chrome), SpiderMonkey (Firefox) ve Chakra (IE / Edge) gibi modern Javascript uygulamalarının tümü JIT derlemesine ve performansı artırmak için bir dizi başka optimizasyona sahiptir.

Python neden bunlara sahip değil?

Ben her ikisi de hız kazancı iddia PyPy ve IronPython bakıyorum. PyPy Yorumlanan bir dil olan Python'da yazılmış bir Python uygulamasının C. IronPython'daki başvuru uygulamasından nasıl daha hızlı olacağını anlamıyorum, aynı fikir ama .NET Framework'ün hızı nasıl artıracağını göremiyorum.


2
IronPython - diğer herhangi bir .NET dili gibi - Microsoft'un çok yaygın JIT derleyici uygulamalarının bulunduğu "Ortak Ara Dil" için derlenmiştir.
Doc Brown

2
Programlama dili bir yazılım değil, bir teknik terimdir (bazı belgelerde yazılıdır). Sadece programlama dili uygulamaları yazılımdır (derleyiciler veya tercümanlar olabilir).
Basile Starynkevitch

1
@BasileStarynkevitch: Bu yorumla bize anlatmaya çalıştığın şeyi anlamıyorum. OP CPython, PYPY ve IronPython, yaklaşık açıkça soruyor olan spesifik Python uygulamaları.
Doc Brown

1
@DocBrown Sorunun son paragrafı verildiğinde, Python'a özellikle yorumlanmış bir dil çağırdığında yanlış anlaşılma gösteren ilgili bir nokta gibi görünüyor.
8bittree

Yanıtlar:


19

Python neden bunlara sahip değil?

Performansı önemseyen Python uygulamaları olmadığını düşündüğünüzden emin değilim. PyPy , IronPython ve Jython , performansı önemseyen endüstriyel güce sahip, üretime hazır Python uygulamalarıdır. Pyston , performans için özel olarak oluşturulmuş bir geliştirme içi uygulamadır . Yüksüz Swallow ve Psyco da Python'un performansını geliştirmeye yönelik projelerdi.

Bununla birlikte, CPython kullanıcılarının diğer tüm uygulamaların toplam birleşik kullanıcı tabanından büyük ölçüde fazla olması , Yüksüz Yutmanın topluluk tarafından reddedilmesi, bu projelerin çoğunun ya ölü olduğu ya da geliştiricileri çekmek için mücadele ettiği, Python'un topluluk değerleri performans.

Bu cevap Python topluluğunun tipik zihniyetine iyi bir örnektir: performans sorunlarını düzeltmek yerine kodlarını Python'a yazmayı tercih ederler.

Ben her ikisi de hız kazancı iddia PyPy ve IronPython bakıyorum. PyPy Yorumlanan bir dil olan Python'da yazılmış bir Python uygulamasının C'deki başvuru uygulamasından nasıl daha hızlı olacağını anlamıyorum.

İlk kapalı: derleyici içinde yazıldığı dil önemli değildir Sonuçta, derleyici yalnızca yürütülür. Zamanlar öylesine bile, eğer o önemli değil, yavaş: derleyici performansı alakasız ne alakalı derleyicinin çıktısının performansıdır .

İkincisi, sadece derleyicinin çıktısının ne kadar hızlı olduğu ve derleyicinin Python'da, yani derlediği dilde yazıldığından önemli olduğu için, kendisini derleyerek hızlı bir şekilde kendini yapabilir.

Üçüncüsü, "yorumlanmış dil" diye bir şey yoktur. Dil, bir dizi matematiksel kural ve kısıtlamadır. Bu bir özelliktir. Kağıt parçası. Bir dil derlenmez veya yorumlanmaz. Bir dil sadece olduğunu . Derleme ve yorumlama bir dil uygulamasının özellikleridir , daha doğrusu, bir derleyici veya yorumlayıcı (duh!), Dil değil. Her dil bir derleyici tarafından uygulanabilir. Her dil bir tercüman tarafından uygulanabilir. Mekanik olarak bir derleyiciden bir derleyici ve bir derleyiciden bir tercüman oluşturabilirsiniz.

PyPy aslında çünkü Ama tüm bu aslında gerçekten önemli değil değil Python ile yazılmış. RPython ile yazılmıştır . RPython , RPython programlama dili ve RPython çerçevesi olmak üzere iki bölümden oluşur .

RPython programlama dili Python değildir . Farklı bir programlama dilidir. RPython, kabaca C ile aynı performansa sahip, kabaca Java ile aynı düzeyde, statik olarak yazılan bir programlama dilidir. RPython, Python'un sözdizimsel ve anlamsal bir alt kümesidir, yani her RPython programı geçerli bir Python programıdır ve Python uygulaması tarafından çalıştırılabilir (tipik olarak birkaç büyüklük sırası daha yavaş olsa da, ancak bu hata ayıklama için hala yararlıdır, çünkü Python'un tüm araçlarına erişirsiniz ve yorum hemen başlar, oysa dil uygulaması derleme genellikle 5-10 dakika sürer ), ancak tersi doğru değildir.

RPython çerçevesi, RPython programlama dilinde yüksek performanslı dinamik dil uygulamaları yazmak için bir çerçevedir. Bir çöp toplayıcı, nesne alanı, meta-nesne protokolü, önceden tanımlanmış nesneler, türler ve işlemler vb. İçerir. Ancak taç mücevher, bir tercümandan otomatik olarak bir JIT derleyici oluşturma yeteneğidir: RPython çerçevesinde bir dil uygularsanız, sadece bir tercüman yazmanız gerekir, RPython çerçevesi JIT ile ilgilenir.

RPython platformunda sadece PyPy değil , birçok dil uygulaması vardır.

IronPython, aynı fikir ama ben .NET Framework hızını nasıl artıracağını görmüyorum.

Microsoft veya Mono'nun çeşitli .NET varyantları gibi ISO CLI uygulamalarının çoğu, karmaşık çöp toplayıcıları, optimize ediciler ve derleyiciler içerir. Aynı şey Jython ve Java uygulamaları için de geçerlidir.

IronPython bir derleyicidir, Python kaynak kodunu DLR ağaçlarına derler (DLR Dinamik Dil Çalışma Zamanı), daha sonra CIL bayt koduna daha da derlenir ve daha sonra yine tipik olarak yerel makine koduna derlenir.


6

V8 (Chrome), SpiderMonkey (Firefox) ve Chakra (IE / Edge) gibi modern Javascript uygulamalarının tümü JIT derlemesine ve performansı artırmak için bir dizi başka optimizasyona sahiptir.

Python neden bunlara sahip değil?

JavaScript web tarayıcılarına dahildir ve günümüzde önemli miktarda yazılım web tarayıcılarında çalışacak şekilde tasarlanmıştır. Bu, Google'ın, Apple'ın ve Microsoft gibi şirketlerin JavaScript çalışma zamanlarını hızlı hale getirmek için birçok kaynağa yatırım yapmasını sağlayarak JavaScript performansını çok önemli hale getirir. Bu para akışı Python'a yönlendirilseydi, aynı derecede hızlı olurdu.

PyPy Yorumlanan bir dil olan Python'da yazılmış bir Python uygulamasının C'deki başvuru uygulamasından nasıl daha hızlı olacağını anlamıyorum.

Fikir, kod bir kez JIT-ed olduğunda, artık "yorumlanmaz" dır. PyPI, Python kodunu daha sonra doğrudan işlemci üzerinde yürütülen makine koduna (örn. X86_64 makine kodu) dönüştürerek çalışır.


3
Özellikle ilgili olan, web tarayıcısında JavaScript'e alternatif olmamasıdır (veya en azından henüz tüm büyük tarayıcılarda genellikle hiçbir şey yoktur). Web tarayıcısında hızlı performans istiyorsanız, hızlı bir JavaScript uygulamasına sahip olmanız gerekir. Oysa Python'u çalıştıran platformlarda, kesinlikle daha iyi performans gösteren bir uygulamaya sahip olabilecek başka bir dile geçebilirsiniz.
8bittree

-3

Python kodunuzu ana python dosyası olarak basit bir üst düzey başlatma ile modüller halinde yapılandırırsanız (içinde çok az kodla), python kodunuzun geri kalanını makineden bağımsız bayt koduna derler, bunlar Dizin yapınızda gördüğünüz .pyc dosyaları. Bu, ilk çalıştırmadan sonra yükleme ve yorumlama sürelerini en aza indirir.

Komut dosyanızı -O veya -OO bayraklarıyla başlatırsanız veya PYTHONOPTIMIZE değerini 0'dan büyük bir değere ayarlarsanız, daha da optimize edilen .pyo dosyaları oluşturulur.

Bazı belirli işlev (ler) için yüksek optimizasyona ihtiyacınız varsa, bunları C, C ++, FORTRAN veya GO'ya yazabilir ve sonra bunları python içinden kullanabilirsiniz.


C olmayan uzantıları Python'a nasıl entegre edersiniz? Sadece Cython için C-eklentilerinin farkındayım.

1
@Bey: Temel olarak paylaşılan bir kitaplıktaki (.dll veya .so) herhangi bir şey, işlev imzalarını bilmeniz koşuluyla python'dan çağrılabilir - bunlar elle yapılandırılabilir, salıncak gibi araçlar tarafından üretilebilir veya hatta doxygen belgelerinden bile oluşturulabilir. stackoverflow.com/questions/5811949/… olduğu gibi yardımcı olur blog.heroku.com/see_python_see_python_go_go_python_go
Steve Barnes
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.