SORU
7 Kasım 2012, ÇARŞAMBA


Neden Dilimleme startswith daha yavaştır

Neden startwith uygulanması Dilimleme yavaştır?

In [1]: x = 'foobar'

In [2]: y = 'foo'

In [3]: %timeit x.startswith(y)
1000000 loops, best of 3: 321 ns per loop

In [4]: %timeit x[:3] == y
10000000 loops, best of 3: 164 ns per loop

Şaşırtıcı, hatta uzunluğu hesaplama da dahil olmak üzere, Dilimleme hala önemli ölçüde daha hızlı görünür:

In [5]: %timeit x[:len(y)] == y
1000000 loops, best of 3: 251 ns per loop

Not: bu davranış ilk bölümü Python for Data Analysis (Bölüm 3) not edilir, ama bunun için hiçbir açıklama yapmadı.

.

Eğer yararlı: here is the C code for startswith; ve burada dis.dis çıkış:

In [6]: import dis

In [7]: dis_it = lambda x: dis.dis(compile(x, '<none>', 'eval'))

In [8]: dis_it('x[:3]==y')
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (3)
              6 SLICE 2             
              7 LOAD_NAME                1 (y)
             10 COMPARE_OP               2 (==)
             13 RETURN_VALUE        

In [9]: dis_it('x.startswith(y)')
  1           0 LOAD_NAME                0 (x)
              3 LOAD_ATTR                1 (startswith)
              6 LOAD_NAME                2 (y)
              9 CALL_FUNCTION            1
             12 RETURN_VALUE 

CEVAP
7 Kasım 2012, ÇARŞAMBA


Bazıperformans farkı dikkate . operatör şeyi yapmak için gereken zamanı alarak açıklanabilir:

>>> x = 'foobar'
>>> y = 'foo'
>>> sw = x.startswith
>>> %timeit x.startswith(y)
1000000 loops, best of 3: 316 ns per loop
>>> %timeit sw(y)
1000000 loops, best of 3: 267 ns per loop
>>> %timeit x[:3] == y
10000000 loops, best of 3: 151 ns per loop

Farkı, bir kısım startswith Bir olması ile açıklanabilirişlevi-op hiçbir işlev çağrıları biraz zaman alabilir , ve hatta:

>>> def f():
...     pass
... 
>>> %timeit f()
10000000 loops, best of 3: 105 ns per loop

Bu değilkesinliklesürüm Dilimleme ve len kullanarak bir işlev çağrıları ve hala daha hızlı olduğu için çok büyük bir fark olduğunu, (-- 267 ns yukarıda sw(y) compare):

>>> %timeit x[:len(y)] == y
1000000 loops, best of 3: 213 ns per loop

Sadece benim tahminim burada belki Python optimize yerleşik işlevler için zaman arama veya len çağrı ağır getirilmiş muhtemelen doğru olan). len işlev bir özel ile test etmek mümkün olabilir. Ya da belki bu farklar LastCoder tarafından tespit tekme yer. Not da larsmans' uzun dizeleri için startswith aslında daha hızlı olduğunu gösteren sonuçlar. Akıl bütün çizgi yukarıda bahsettiğim yükü gerçekten anlamlı bulunduğu durumlar için geçerlidir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fireflame65

    fireflame65

    27 Mart 2007
  • Mismag822 - The Card Trick Teacher

    Mismag822 -

    18 EKİM 2008
  • The10HourMan

    The10HourMan

    28 EYLÜL 2012