Neden Python kodunu derlemeliyim?


241

Neden bir Python betiği derleyesiniz? Onları doğrudan .py dosyasından çalıştırabilirsiniz ve iyi çalışır, bu yüzden bir performans avantajı veya başka bir şey var mı?

Uygulamamdaki bazı dosyaların .pyc içine derlendiğini, diğerleri ise derlemediğini fark ettim, neden bu?


Ayrıca, uygulamanızın daha hızlı başlatılması da dahil olmak üzere, şirket sırrı ise kodunuzu paylaşamıyorsanız güvenlikten de yararlandığınızı da unutmayın.
Please_Dont_Bully_Me_SO_Lords

@PSyLoCKe Gerçekten, gerçekten yapma. Python bayt kodu gerçekten okunabilir, çünkü derleyicinin onu optimize etmek için gizlemesine gerek yok. (Çok fazla optimize ettiği için değil ...)
wizzwizz4

1
Bazı dosyaların otomatik olarak derlenmesinin nedeni içe aktarılmalarıdır; örneğin, kullanırsanız import mylib.py, Python mylib.pygelecek importifadelerin biraz daha hızlı çalışmasını sağlayacak şekilde derlenir . Daha sonra değiştirirseniz mylib.py, bir sonraki içe aktarıldığında yeniden derlenir (Python bunun gerçekleştiğini görmek için dosya tarihini kullanır.)
fyngyrz

Yanıtlar:


270

Çok, çok, çok daha hızlı kullanılabilen bayt koduna derlenmiştir.

Bazı dosyaların derlenmemesinin nedeni, python main.pyher çalıştırdığınızda çağırdığınız ana komut dosyasının yeniden derlenmesidir. İçe aktarılan tüm komut dosyaları derlenir ve diskte saklanır.

Ben Blank'in önemli katkıları :

Bir derlenmiş komut dosyası çalıştıran bir hızlı sahipken belirterek It değerinde başlatma (derlenmesini gerekmez gibi) zaman, o değil koşmak daha hızlı.


260
Bir derlenmiş komut dosyası çalıştıran bir hızlı sahipken belirterek It değerinde başlatma (derlenmesini gerekmez gibi) zaman, o değil koşmak daha hızlı.
Ben Blank

24
Yaygın bir yanlış anlama. Paylaşım için teşekkürler.
09:49

1
Derleme gerektirmemesine ek olarak, .pyc dosyası neredeyse her zaman daha küçüktür. Özellikle çok yorum yaparsanız. Benimkilerden biri 28419, .py, ancak sadece 17879 .pyc - yani yükleme süresi de daha iyi. Son olarak, üst düzey komut dosyalarını bu şekilde önceden derleyebilirsiniz: python -m compileall myscript.py
fyngyrz

1
Bellek tüketiminde bir fark var mı? Sadece 64MB RAM ile mips cpu tabanlı gömülü cihazlarda Python test ediyorum, bu yüzden python betiğinin derlenmiş bir sürümünü başlatırken bellek kullanımında herhangi bir avantaj var mı?
valent

1
@valentt: Muhtemelen hayır. Python içleri hakkında çok şey bilmiyorum, ama bytecode'a ayrıştırmanın Python'da çok fazla bellek aldığını düşünmüyorum. Bazı durumları hatırlamak için çok fazla belleğe ihtiyaç duyan bir şey düşünemiyorum.
Georg Schölly

80

.Pyc dosyası zaten bayt koduna derlenmiş Python'dur. Python, çağırdığınız .py dosyasıyla aynı ada sahip bir dosya bulursa otomatik olarak bir .pyc dosyası çalıştırır.

"Python'a Giriş" derlenmiş Python dosyaları hakkında şunları söylüyor :

Bir program '.pyc' veya '.pyo' dosyasından okunduğunda '.py' dosyasından okunduğundan daha hızlı çalışmaz; '.pyc' veya '.pyo' dosyaları hakkında daha hızlı olan tek şey, yüklenme hızıdır.

Bir .pyc dosyası çalıştırmanın avantajı, Python'u çalıştırmadan önce derleme yükünü ödemek zorunda olmamasıdır. Python zaten .py dosyasını çalıştırmadan önce bayt kodunu derleyeceğinden, bunun dışında herhangi bir performans artışı olmamalıdır.

Derlenmiş .pyc dosyalarını kullanarak ne kadar gelişme elde edebilirsiniz? Bu komut dosyasının ne yaptığına bağlıdır. Basitçe "Merhaba Dünya" yazdıran çok kısa bir komut dosyası için, derleme toplam başlatma ve çalıştırma süresinin büyük bir yüzdesini oluşturabilir. Ancak bir komut dosyasını toplam çalışma süresine göre derleme maliyeti, daha uzun süre çalışan komut dosyaları için azalır.

Komut satırında adlandırdığınız komut dosyası hiçbir zaman bir .pyc dosyasına kaydedilmez. Yalnızca bu "ana" komut dosyası tarafından yüklenen modüller bu şekilde kaydedilir.


3
Çoğu durumda bir fark görmek zordur, ancak 300.000'den fazla satır içeren belirli bir python dosyam var. (Bu, test için başka bir komut dosyası tarafından oluşturulan bir grup matematik hesaplamasıdır) Derlenmesi 37 saniye ve yürütmesi sadece 2 saniye sürer.
wojtow

54

Artılar:

Birincisi: hafif, yenilebilir şaşkınlık.

İkincisi: derleme daha küçük bir dosya ile sonuçlanırsa, daha hızlı yükleme süreleri elde edersiniz. Web için güzel.

Üçüncüsü: Python derleme adımını atlayabilir. Başlangıç ​​yükünde daha hızlı. CPU ve web için güzel.

Dördüncüsü: ne kadar çok yorum yaparsanız, .pycveya .pyodosya kaynak .pydosyayla karşılaştırıldığında o kadar küçük olur .

Beşinci olarak: sadece bir .pycveya .pyodosyaya sahip bir son kullanıcının size anlatmayı unuttukları geri döndürülmemiş bir değişikliğin neden olduğu bir hatayı sunma olasılığı daha düşüktür.

Altıncı: Gömülü bir sistemi hedefliyorsanız, gömmek için daha küçük boyutlu bir dosya elde etmek önemli bir artı olabilir ve mimari stabildir, bu nedenle aşağıda ayrıntıları verilen bir dezavantaj devreye girmez.

Üst düzey derleme

Bir üst düzey python kaynak dosyasını bir .pycdosyaya şu şekilde derleyebileceğinizi bilmek yararlıdır :

python -m py_compile myscript.py

Bu, yorumları kaldırır. docstringsBozulmamış bırakır . Siz de bundan kurtulmak docstringsistiyorsanız (bunu neden yaptığınızı ciddi bir şekilde düşünmek isteyebilirsiniz) bunun yerine bu şekilde derleyin ...

python -OO -m py_compile myscript.py

... ve .pyodosya yerine dosya alırsınız .pyc; kodun temel işlevselliği açısından eşit olarak dağıtılabilir, ancak soyulmuş olanın boyutuna göre daha küçüktür docstrings(ve docstringsilk etapta iyi olsaydı sonraki istihdam için daha az kolayca anlaşılabilir ). Ancak aşağıdaki üç dezavantaja bakın.

Python'un .pydosyayı varsa veya varsa dosyanın .pyyerine getirilip getirilmeyeceğine karar vermek için dosyanın tarihini kullandığını unutmayın. Bu nedenle .py dosyanızı düzenleyin ve veya eski. Veya yararlarını tekrar alabilmek için yeniden derlemeniz gerekir..pyc.pyo.pyc.pyo.pyc.pyo

Dezavantajları:

Birincisi: İçinde bir "sihirli çerez" var .pycve .pyopython dosyasının derlendiği sistem mimarisini gösteren dosyalar var. Bu dosyalardan birini farklı türde bir ortama dağıtırsanız bozulur. İlişkilendirilmiş .pycveya .pyoilişkilendirilmemiş .pyyeniden derleme veya dağıtmak touchyerine dağıtırsanız, .pycveya .pyoson kullanıcı da düzeltemez.

İkincisi: Yukarıda açıklandığı gibi komut satırı seçeneğinin docstringskullanımı ile atlanırsa -OO, hiç kimse bu bilgiye ulaşamayacaktır, bu da kodu daha zor (veya imkansız) hale getirebilir.

Üçüncüsü: Python'un -OOseçeneği ayrıca -Okomut satırı seçeneğine göre bazı optimizasyonlar uygular ; bu işlemin değişmesine neden olabilir. Bilinen optimizasyonlar:

  • sys.flags.optimize = 1
  • assert ifadeler atlandı
  • __debug__ = Yanlış

Dördüncüsü: Python betiğinizi #!/usr/bin/pythonilk satırdaki bir şeyle kasıtlı olarak yürütülebilir hale getirdiyseniz , bu çıkarılır .pycve .pyodosyalar ve bu işlevsellik kaybolur.

Beşinci: biraz açıktır, ancak kodunuzu derlerseniz, sadece kullanımı etkilenmekle kalmaz, aynı zamanda başkalarının işinizden öğrenme potansiyeli, genellikle ciddi şekilde azalır.


10

Derlenmiş python çalıştırmada bir performans artışı vardır. Ancak bir .py dosyasını içe aktarılan modül olarak çalıştırdığınızda, python bu dosyayı derleyip saklar ve .py dosyası değişmediği sürece her zaman derlenmiş sürümü kullanır.

Dosya kullanıldığında iç içe geçmiş herhangi bir dilde işlem şöyle görünür:
1. Dosya yorumlayıcı tarafından işlenir.
2. Dosya derlendi
3. Derlenmiş kod yürütülür.

Açıkçası önceden derlenmiş kod kullanarak adım 2 ortadan kaldırabilirsiniz, bu python, PHP ve diğerleri geçerlidir.

Heres ilginç bir blog yazısı http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
İşte Python derleme işlemini açıklayan bir giriş http://effbot.org/zone /python-compile.htm


9

Daha önce de belirtildiği gibi, python kodunuzun bayt koduna derlenmesini sağlayarak performans artışı elde edebilirsiniz. Bu genellikle yalnızca içe aktarılan komut dosyaları için python tarafından işlenir.

Python kodunuzu derlemenin başka bir nedeni, fikri mülkiyetinizi kopyalanmaya ve / veya değiştirilmeye karşı korumak olabilir.

Bununla ilgili daha fazla bilgiyi Python belgelerinde bulabilirsiniz .


2
Kodunuzu korumak için - derleme çok yardımcı olmaz. Gizlemek derleme - ama arzu sahibi biri ne olursa olsun kodunu alacak.
Josh Smeaton

1
@josh her zaman mümkündür, eğer belleğe erişebilir veya CPU'ya talimatları izleyebilir, yeterli zaman ve uygulamanızı yeniden oluşturabilirler.
UnkwnTech

5
Ancak Unkwntech'in dediği gibi, kişi yeterince belirlenirse bu her zaman mümkün olacaktır. Ama çoğu durumda, insanların sadece kodunuzu "düzeltmesini" kısıtlamak istediğinizde yeterli olacağına inanıyorum ...
Simon B. Jensen

Baytkod için derlenen diller genellikle onları gizlemek için fazladan adımlar atmadıkça ters-derlemek o kadar da zor değildir - sadece derlemek genellikle yeterli olmaz.
EJoshuaS - Monica

7

Derlenmiş bir komut dosyasını çalıştırırken kesinlikle bir performans farkı vardır. Normal .pykomut dosyaları çalıştırırsanız , makine her çalıştırıldığında derler ve bu zaman alır. Modern makinelerde bu neredeyse hiç fark edilmez, ancak senaryo büyüdükçe daha fazla sorun haline gelebilir.


7

Dokunulmayan bir şey, kaynaktan kaynağa derleme . Örneğin, nuitkaPython kodunu C / C ++ 'ya çevirir ve daha yavaş sanal makinede çalışan Python bayt kodu yerine doğrudan CPU üzerinde çalışan ikili koda derler.

Bu, önemli hızlanmalara yol açabilir veya ortamınız C / C ++ koduna bağlıyken Python ile çalışmanıza izin verir.


4

Kaynak koda erişimi olmayan kullanıcılara dağıtmak için derlenmiş kod kullanıyoruz. Temelde deneyimsiz programcıları yanlışlıkla bir şeyleri değiştirmeyi veya bize söylemeden hataları düzeltmeyi durdurmak.


2

Evet, performans ana sebep ve bildiğim kadarıyla tek sebep.

Dosyalarınızdan bazıları derlenmiyorsa, belki de dizin izinleri veya başka bir şey nedeniyle Python .pyc dosyasına yazamaz. Ya da derlenmemiş dosyalar hiç yüklenmiyor ... (komut dosyaları / modüller sadece ilk yüklendiklerinde derlenir)


1

Yeni başlayanlar, .pyc dosyaları nedeniyle Python'un derlendiğini varsayar. .Pyc dosyası derlenmiş bayt kodudur ve daha sonra yorumlanır. Python kodunuzu daha önce çalıştırdıysanız ve .pyc dosyasını elinizde bulundurursanız, bayt kodunu yeniden derlemek zorunda olmadığından ikinci kez daha hızlı çalışır.

derleyici: Derleyici, üst düzey dili makine diline çeviren bir kod parçasıdır

Tercümanlar: Tercümanlar ayrıca üst düzey dili makinede okunabilir ikili eşdeğerlere dönüştürür. Bir tercüman her çalıştırıldığında üst düzey bir dil kodu aldığında, kodu makine koduna dönüştürmeden önce ara ara koda dönüştürür. Kodun her bir kısmı yorumlanır ve daha sonra bir sırayla ayrı ayrı yürütülür ve kodun bir bölümünde bir hata bulunursa, kodun sonraki kod dizisini çevirmeden yorumlanmasını durduracaktır.

Kaynaklar: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter


9
"Derleyici" tanımınız yanlış. Bir derleyici hiçbir zaman makine kodunu derlemek için kullanılmamıştır. Bir derleyici sadece bir dilden diğerine çevirmen. Bu yüzden Python'un bayt koduna "derlediğini", Coffeescript'in Javascript'e "derlediğini" vb. Söylüyoruz.
Ricky Stewart
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.