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

  • BSA

    BSA

    9 NİSAN 2012
  • colacas

    colacas

    29 EKİM 2006
  • Eric Enge

    Eric Enge

    2 Kasım 2009