Python'un (ve diğer dinamik dillerin) hangi anlamsal özellikleri yavaşlığına katkıda bulunur?
Yok.
Dil uygulamalarının performansı, dil özelliklerinin değil, paranın, kaynakların ve doktora tezlerinin bir işlevidir. Öz , Smalltalk'ten çok daha dinamiktir ve Python, Ruby, ECMAScript veya Lua'dan biraz daha dinamiktir ve mevcut tüm Lisp ve Smalltalk VM'lerinden daha iyi performans gösteren bir sanal makineye sahipti (aslında, Öz Özçekim, Öz ve hatta bu, mevcut Smalltalk VM'lerin çoğundan daha hızlıydı) ve zamanın C ++ uygulamalarından daha rekabetçi ve hatta bazen daha hızlıydı.
Daha sonra Sun, Self'i finanse etmeyi bıraktı ve IBM, Microsoft, Intel ve Co. C ++ 'ı finanse etmeye başladı ve trend tersine döndü. Öz geliştiriciler, kendi şirketlerini kurmak için Sun'ı terk ettiler; Self VM için geliştirilen teknolojiyi şimdiye kadarki en hızlı Smalltalk VM'lerden (Animorphic VM) biri haline getirdiler ve ardından Sun bu şirketi geri aldı ve biraz değiştirilmiş versiyonu bu Smalltalk VM şimdi "HotSpot JVM" adı altında daha iyi bilinmektedir. İronik olarak, Java programcıları, aslında Java olduğunda "yavaş" olduğu için dinamik dilleri araştırıyorDinamik dil teknolojisini kabul edinceye kadar yavaştı. (Evet, doğru: HotSpot JVM aslında bir Smalltalk VM'dir. Bayt kodu doğrulayıcısı çok fazla türde kontrol yapar, ancak bayt kodu doğrulayıcı tarafından kabul edildiğinde, VM ve özellikle optimize edici ve JIT aslında yapmaz. Statik tipleri ile çok ilgi!)
CPython, dinamik dilleri (ya da daha doğrusu dinamik gönderimi) hızlı kılan şeylerin çoğunu yapmaz: dinamik derleme (JIT), dinamik optimizasyon, spekülatif satır içi, uyarlamalı optimizasyon, dinamik optimizasyon, dinamik tip geri besleme / çıkarım. Ayrıca hemen hemen tüm çekirdeğin ve standart kütüphanenin C dilinde yazılması sorunu da var; bu, Python 100x’i birdenbire daha hızlı yapsanız bile, size çok yardımcı olmayacaktır, çünkü Python programı, Python değil C'dir. Her şey Python'da yazılmış olsaydı, ılımlı hızlanmalar bile, algoritmaların daha hızlı, çekirdek veri yapılarının daha hızlı hale geldiği çığ gibi bir etki yaratırdı, ama elbette, çekirdek veri yapıları da algoritmalar ve çekirdek algoritmalar ve çekirdek verileri içinde kullanılıyordu. yapılar başka her yerde kullanılır,
Bugünün sistemlerinde bellek tarafından yönetilen OO dilleri (dinamik olsun ya da olmasın) için kötü bir şekilde kötü olan birkaç şey var. Sanal Bellek ve Bellek Koruması, özellikle çöp toplama performansı ve genel olarak sistem performansı için bir katil olabilir. Ve güvenli bir dilde tamamen gereksiz: dilde başlangıçta herhangi bir hafıza erişimi olmadığında neden yasadışı hafıza erişimine karşı koruma sağlanıyor? Azul, modern güçlü MMU'ları (Intel Nehalem ve daha yenisi ve AMD'nin eşdeğeri) engellemek yerine çöp toplama işlemine yardımcı olduğunu düşündü , ancak CPU tarafından desteklense de, ana işletim sisteminin işletim sistemindeki mevcut bellek alt sistemleri yeterince güçlü değil Buna izin vermek (Azul'un JVM'sinin çıplak metalinde sanallaştırılmış çalışmasının nedeni budur) yanında işletim sistemi, içinde değil).
Singularity OS projesinde, Microsoft, işlem ayırma için tip sistem yerine MMU koruması kullanıldığında, sistem performansında ~% 30'luk bir etki ölçmüştür.
Azul, uzman Java işlemcilerini oluştururken fark ettiği başka bir şey, modern ana işlemcilerin, önbellek özlüyor maliyetlerini azaltmaya çalışırken tamamen yanlış olan şeye odaklanmalarıydı: şube tahmini, bellek önyükleme gibi şeyler yoluyla önbellek özlüyor sayısını azaltmaya çalışıyorlar. ve bunun gibi. Ancak, ağır polimorfik bir OO programında, erişim kalıpları temel olarak sahte rastgeledir, tahmin etmek için hiçbir şey yoktur. Bu yüzden, bu transistörlerin tümü tamamen boşa harcanmıştır ve bunun yerine yapılması gereken, her önbellek kaçırma maliyetini düşürmektir. (Toplam maliyet #misses * maliyettir, ana akım ilk sırayı indirmeye çalışır, ikinci Azul'dur.) Azul'un Java Bilgi İşlem Hızlandırıcıları uçuşta 20000 eşzamanlı önbellek özeti çekebilir ve hala ilerleme kaydedebilir.
Azul başladığında, onlar düşünce bazı off-the-raf I / O bileşenleri almak ve kendi özel CPU çekirdek tasarımı olacaktır, ama ne onlar aslında sona erdi gerek yapmak tam tersi oldu: onlar oldukça standart amansız aldı raf 3 adresli RISC çekirdeği ve kendi bellek denetleyicisi, MMU ve önbellek alt sistemini tasarladı.
tl; dr : Python'un "yavaşlığı" dilin bir özelliği değildir, ancak a) saf (birincil) uygulaması ve b) modern CPU'ların ve işletim sistemlerinin C'nin hızlı çalışmasını sağlamak için özel olarak tasarlandıkları ve özellikleri C için ya yardım etmiyor (önbellek) ya da aktif olarak zarar veren (sanal bellek) Python performansı var.
Buraya dinamik geçici polimorfizm ile hemen hemen hafıza ile yönetilen herhangi bir dili ekleyebilirsiniz… verimli bir uygulamanın zorlukları söz konusu olduğunda, Python ve Java bile “hemen hemen aynı dildir”.