2010-11-14 16 views
11

, biz iki şekilde listelerini arada kullanabilirsiniz:`extend` `+ =` dan daha hızlı mı? python'da

  1. lst.extend (another_lst)
  2. lst + = another_lst ben extend, += kullanarak daha hızlı olacağını düşündüm

bunun nedeni Diğer ikisini kullanarak yeni bir tane oluşturmak yerine listeyi yeniden kullanır.

Ama timeit olmadan test, bunun += daha hızlı olduğu ortaya çıktı,

>>> timeit('l.extend(x)', 'l = range(10); x = range(10)') 
0.16929602623 
>>> timeit('l += x', 'l = range(10); x = range(10)') 
0.15030503273 
>>> timeit('l.extend(x)', 'l = range(500); x = range(100)') 
0.805264949799 
>>> timeit('l += x', 'l = range(500); x = range(100)') 
0.750471830368 

ben timeit koymak koduyla yanlış bir şey var mı?

+0

Bize zaman kazandırabilir misiniz? Ayrıca, bu operasyonlar hem yerinde, hem de herhangi bir farkı açıklamayacaktır. –

+0

Daha büyük listeler kullanmanız gerektiğini düşünüyorum, bu küçücük boyutta, en ufak arka plan etkinliği bile sonucu düzeltebilir. – vichle

+0

@ Space_C0wb0y @vischle Satoru'nun 200'den fazla öğenin listeleriyle bile ne bildirdiği ile tutarlı sonuçlar elde ediyorum. + = biraz, ama sürekli, daha hızlıdır. Bu oldukça tuhaf. –

cevap

17

DÜZENLEME: Performansı test ettim ve farkları önemli düzeylere çoğaltamam.


İşte bytecode - tutarsızlıkları işaret etmek için @John Machin'e teşekkürler. extend yerine INPLACE_ADD bir CALL_FUNCTION kullandığı

>>> import dis 
>>> l = [1,2,3] 
>>> m = [4,5,6] 
>>> def f1(l, m): 
...  l.extend(m) 
... 
>>> def f2(l,m): 
...  l += m 
... 
>>> dis.dis(f1) 
    2   0 LOAD_FAST    0 (l) 
       3 LOAD_ATTR    0 (extend) 
       6 LOAD_FAST    1 (m) 
       9 CALL_FUNCTION   1 
      12 POP_TOP 
      13 LOAD_CONST    0 (None) 
      16 RETURN_VALUE 
>>> dis.dis(f2) 
    2   0 LOAD_FAST    0 (l) 
       3 LOAD_FAST    1 (m) 
       6 INPLACE_ADD 
       7 STORE_FAST    0 (l) 
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE 

dikkat edin. Her türlü önemsiz performans farklılıkları muhtemelen buna indirgenebilir.

+0

Sadece öznitelik değil, aynı zamanda bir işlev çağrısı. – Constantin

+0

@Constantin, çoğunlukla özellik aramak bence. 'INPLACE_ADD 'sadece nesne üzerinde tanımlanan' __iadd__' yönteminin yollarını gösterir. – aaronasterling

+0

@katriealex, @Constantin, @aaronsterling: Şeyh. Bir LOAD_ATTR ve bir INPLACE_ADD ** ve bir STORE_FAST ** –

İlgili konular