2010-10-07 16 views

cevap

29

bir modül yüklendiğinde, py dosyası dosyaları PYC için "bayt derlenmiş" dır. Zaman damgası pyc dosyalarına kaydedilir. Bu işlem daha hızlı çalışmasına değil, daha hızlı yüklenmesine neden olur. Bu nedenle, bunları yüklediğinizde "bayt derleme" modülleri anlamlıdır.

: "Bayt kodu derleme" konulu PEP 3147 itibaren [Düzenle notları eklemek için, referanslar]

:

CPython kaynak kodunu derler "bayt kodu" içine ve performans nedenleriyle, bu bayt kodu o önbelleğe Kaynak dosyada her değişiklik olduğunda dosya sistemi. Bu, Python modüllerinin yüklenmesini çok daha hızlı hale getirir, çünkü derleme aşaması atlanabilir. Kaynak dosyanız foo.py olduğunda, CPython kaynağın hemen yanında bir foo.pyc dosyasında kodunu önbelleğe alır.

Nasıl bayt kodu derlenmiş dosyalardır Python sürümü ve "py" dosya değişikliklerine göre izlenir:

Ayrıca ".pyc" dosyalar derlenmiş bayt kod sihirli sayı ekler. Python, genellikle büyük sürümlerde, bayt kod formatını değiştirdiğinde bu değişir.
Bu, VM'nin önceki sürümleri için oluşturulmuş pyc dosyalarının soruna neden olmamasını sağlar. Zaman damgası, pyc dosyasının oluşturmak için kullanılan olan py dosyasına eşleştiğinden emin olmak için kullanılır. Sihirli sayı veya zaman damgası eşleşmediğinde, py dosyası yeniden derlenir ve yeni bir pyc dosyası yazılır.

"pyc" dosyaları Python önemli sürümler arasında uyumlu değildir. Python olmayan bir eşleştirme sihirli sayı ile bir pyc dosya bulduğunda, geri kaynağını recompiling yavaş sürecine düşer. piton sürümü değişirse sadece, bir daha çalışmaz aynı platform için derlenmiş ".pyc" dosyaları dağıtmak eğer

, nedenini Thats. Kısaca

yılında

"bir bayt derlenmiş dosya varsa.pyc "ve zaman damgası son olduğunu gösterir o zaman diğer bilge python yüklenecektir" .py "dosyaları yükleme daha yavaş yaklaşımı üzerine düşecektir." .py "dosyasının yürütme performansı etkilenmez ama yükleme ".pyc" dosyaların ".py" dosyaları daha hızlıdır.

yürütme düşünün dedi b.py

Typical total performance = loading time (A.py) + execution time (A.py) + 
          loading time (B.py) + execution time (B.py) 

Since loading time (B.pyc) < loading time (B.py) 

You should see a better performance by using the byte compiled "pyc" files. 

ithal ettiği a.py büyük bir komut dosyası X varsa p, modülerleştirilerek ve diğer modüllere aktarılması, bayt kodu derlenmiş dosya için daha düşük yükleme süresinin avantajından yararlanma ile sonuçlanır.

Diğer bir çıkarım, modüllerin betik veya ana dosyadan daha kararlı olma eğiliminde olmasıdır. Bu nedenle hiç bir şekilde derlenmiş değil.

Kaynaklar

+0

"Modüller, komut dosyasından veya ana dosyadan daha kararlı olma eğilimindedir". Bu iki terim arasındaki fark nedir? Modüller değil, dosyalar mı? Ayrıca, yürütme ve yükleme süresi arasındaki fark nedir? –

0

/usr/bin. .pyc dosyası aynı dizinde oluşturulur, böylece genel konumu kirletir.

+0

hız önemli bir faktördür olsaydı, o zaman ana komut dosyası (mümkün olduğunca basit olması olmalıdır böylece çoğu o kod derlenmiş olurdu)? – George41

+0

@ George41: python doc referansına göre, yürütme hızı bir faktör değildir. Daha hızlı yükleme süresi. – pyfunc

+1

Ancak, dokümanlar şöyle ifade edilir: "Böylece, bir komut dosyasının başlangıç ​​zamanı, kodunun çoğunu bir modüle taşıyarak ve bu modülü içe aktaran küçük bir önyükleme komut dosyasına sahip olmakla azaltılabilir", ancak bir * büyük * komut dosyanız yoksa, bu büyük olasılıkla overkill –

İlgili konular