SORU
4 Kasım 2009, ÇARŞAMBA


Backticks python yorumlayıcısı için ne ifade ediyor: `num`

Etrafta liste üreteçleri ile oynuyorum ve karşısında başka bir sitede bu küçük parçacık geldim:

return ''.join([`num` for num in xrange(loop_count)])

Birkaç dakika `num` bit kırılma olduğunu fark ettiklerinde önce fonksiyon (yazarak) çoğaltmak için harcadım.

Bu karakterleri bir açıklama çevreleyen ne yapar? Bu gördüğüm kadarıyla. str eşdeğer(sayı). Ama tuttum:

return ''.join([str(num) for num in xrange(10000000)])

4.09 ise s alır:

return ''.join([`num` for num in xrange(10000000)])

2.43 alır.

Her ikisi de ama çok yavaş aynı sonuçlar verir. Burada neler oluyor?

DÜZENLEME:Garip bir şekilde... repr() `num` göre biraz daha yavaş sonuç verir. 2.99 s vs 2.43. Kullanan Python 2.6 (3.0 henüz denemedim).

CEVAP
4 Kasım 2009, ÇARŞAMBA


Backticks repr() kaldırılan bir diğer adı. Onları daha fazla kullanmayın, sözdizimi Python 3.0 kaldırıldı.

Backticks kullanarak repr(num) veya sürüm 2 num.__repr__() kullanarak daha hızlı gibi görünüyor.x. Ek sözlük arama genel ad (repr), veya nesnenin ad (__repr__) sırasıyla gerekli olduğu için sanırım.

EDİT: dis modülü kullanarak benim varsayım kanıtlıyor:

def f1(a):
    return repr(a)

def f2(a):
    return a.__repr__()

def f3(a):
    return `a`

Gösterir sökülmesi:

>>> import dis
>>> dis.dis(f1)
  3           0 LOAD_GLOBAL              0 (repr)
              3 LOAD_FAST                0 (a)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE
>>> dis.dis(f2)
  6           0 LOAD_FAST                0 (a)
              3 LOAD_ATTR                0 (__repr__)
              6 CALL_FUNCTION            0
              9 RETURN_VALUE        
>>> dis.dis(f3)
  9           0 LOAD_FAST                0 (a)
              3 UNARY_CONVERT       
              4 RETURN_VALUE   

f1 backtick operatör ayrı bir işlem kodu uygulanır ise __repr__, ** f2 20 öznitelik araması için küresel bir arama içerir. İşlev çağrıları (CALL_FUNCTION) için sözlük arama (LOAD_GLOBAL/LOAD_ATTR için ne yükü diye bir şey yok bu yana, backticks daha hızlıdır.

Sanırım Python Millet karar olması ayrı bir düşük seviye kullanım için repr() değil buna değer, ve her ikisi de repr() ve backticks ihlal ilkesi “olmalı-- ve tercihen tek açık var”, yani bu özellik kaldırıldı Python 3.0.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Just So

    Just So

    3 HAZİRAN 2007
  • psidot

    psidot

    2 Kasım 2006
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009