2016-03-19 17 views
4

Python'un .pyc dosyalarında 5*5+5 gibi basit aritmetikleri önbelleğe aldığını/derlediğini bilmek isterim.Basit sabit kodlu aritmetikler önbelleğe alınmış/derlenmiş mi?

Bazen bir gün için if seconds > 24*60*60 yazmayı severim. Performans üzerindeki etkinin farkedilemez olduğunu biliyorum ama yine de merak ediyorum.

+0

Sadece okunabilirlik açısından bakıldığında, bu hesaplamanın mantıklı bir tanımlayıcıya kaydedilmesinin yol olduğuna dikkat edin. Ayrıca, uygulama ayrıntılarına artık güvenmiyorsunuz. – jonrsharpe

cevap

7

Evet, CPython (varsayılan Python uygulaması), bu ifadeleri bir sayıya daraltmak için peephole optimiser kullanır; Buna constant folding denir.

kullanarak bu kontrol edebilirsiniz dis disassembler:

>>> import dis 
>>> def foo(): 
...  if seconds > 24*60*60: 
...   pass 
... 
>>> dis.dis(foo) 
    2   0 LOAD_GLOBAL    0 (seconds) 
       3 LOAD_CONST    4 (86400) 
       6 COMPARE_OP    4 (>) 
       9 POP_JUMP_IF_FALSE  15 

    3   12 JUMP_FORWARD    0 (to 15) 
     >> 15 LOAD_CONST    0 (None) 
      18 RETURN_VALUE 

LOAD_CONST talimat de 3 ofset Not; 24*60*60 ifadesinin son sonucunu yükler, ifadenin kendisi bayt koduyla gider.

Bkz. fold_binops_on_constants function in the peephole.c file.