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
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.
Neden baskı "B" baskı " ...
Neden Standart girdiden okuma satır Py...
Neden malloc calloc memset daha yavaşt...
Neden 64 int daha uzun yavaştır?...
Neden Azure Dağıtım Windows üzerinde d...