SORU
28 HAZİRAN 2012, PERŞEMBE


Neden Python kodunu daha hızlı bir işlev nedir?

def main():
    for i in xrange(10**8):
        pass
main()

Python çalışan kod bu parça

real    0m1.841s
user    0m1.828s
sys     0m0.012s

Eğer döngü için bir işlev içerisinde yer değil ama ancak

for i in xrange(10**8):
    pass

o zaman çok daha uzun bir süre için çalışır:

real    0m4.543s
user    0m4.524s
sys     0m0.012s

Neden bu?

Not: zamanlama Linux BASH zaman fonksiyonu ile yapılır.

CEVAP
28 HAZİRAN 2012, PERŞEMBE


Bir işlev içinde, bayt kodu

  2           0 SETUP_LOOP              20 (to 23)
              3 LOAD_GLOBAL              0 (xrange)
              6 LOAD_CONST               3 (100000000)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                 6 (to 22)
             16 STORE_FAST               0 (i)

  3          19 JUMP_ABSOLUTE           13
        >>   22 POP_BLOCK           
        >>   23 LOAD_CONST               0 (None)
             26 RETURN_VALUE        

Üst düzeyde, bayt kodu

  1           0 SETUP_LOOP              20 (to 23)
              3 LOAD_NAME                0 (xrange)
              6 LOAD_CONST               3 (100000000)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                 6 (to 22)
             16 STORE_NAME               1 (i)

  2          19 JUMP_ABSOLUTE           13
        >>   22 POP_BLOCK           
        >>   23 LOAD_CONST               2 (None)
             26 RETURN_VALUE        

Fark STORE_FAST daha hızlı olmasıdır (!) STORE_NAME daha. Bu işlevi nedeniyle, i yerel bir ancak üst düzey bir küresel.

Bayt kodu incelemek, dis module kullanın. İşlevi doğrudan sökmeye, ama compile builtin kullanmak zorunda kaldım üst düzey kod sökmeye başardı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DONFANTASTICKYPESS

    DONFANTASTIC

    1 Temmuz 2007
  • Mark Hyder

    Mark Hyder

    6 EKİM 2011
  • Sergio Lafuente Rubio

    Sergio Lafue

    11 Aralık 2008