SORU
10 Mayıs 2012, PERŞEMBE


python str performans

Python kod parçası (python 2.6 3.2) profil oluşturma sırasında, keşfettim Bir dize için bir nesne (benim durumumda bir tam sayı) dönüştürmek için 6* *yöntem neredeyse bir büyüklük sırası dize biçimlendirme kullanarak daha yavaştır.

Burada kriter

>>> from timeit import Timer
>>> Timer('str(100000)').timeit()
0.3145311339386332
>>> Timer('"%s"0000').timeit()
0.03803517023435887

Herkes bu durumda neden biliyor mu? Bir şey mi kaçırdım?

CEVAP
10 Mayıs 2012, PERŞEMBE


'%s' % 100000 derleyici tarafından değerlendirilir ve çalışma zamanında bir sabiti eşdeğerdir.

>>> import dis
>>> dis.dis(lambda: str(100000))
  8           0 LOAD_GLOBAL              0 (str)
              3 LOAD_CONST               1 (100000)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda: '%s' % 100000)
  9           0 LOAD_CONST               3 ('100000')
              3 RETURN_VALUE        

Çalışma zamanı ifade ile % (çok önemli) daha hızlı str daha değil:

>>> Timer('str(x)', 'x=100').timeit()
0.25641703605651855
>>> Timer('"%s" % x', 'x=100').timeit()
0.2169809341430664

Yapmak unutmayın str hala biraz daha yavaş olarak @DietrichEpp dedi. str arama fonksiyonu içerir ve arama işlemleri sırasında % derler bir tek acil bayt kodu:

>>> dis.dis(lambda x: str(x))
  9           0 LOAD_GLOBAL              0 (str)
              3 LOAD_FAST                0 (x)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE        
>>> dis.dis(lambda x: '%s' % x)
 10           0 LOAD_CONST               1 ('%s')
              3 LOAD_FAST                0 (x)
              6 BINARY_MODULO       
              7 RETURN_VALUE        

Elbette yukarıdaki test sistemi (CPython 2.7) için de geçerlidir; diğer uygulamalar farklı olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • paikimchung

    paikimchung

    12 Mayıs 2006
  • RiverCityGraphix

    RiverCityGra

    6 Ocak 2012