Python'da boş bir liste oluşturma


243

Python'da yeni bir boş liste oluşturmanın en iyi yolu nedir?

l = [] 

veya

l = list()

Bunu iki nedenden dolayı soruyorum:

  1. Teknik nedenler, hangisinin daha hızlı olduğu. (sınıf oluşturmak yüke neden olur mu?)
  2. Kod okunabilirliği - hangisi standart sözleşmedir?

4
"Daha hızlı"? Neden timeit koşmadın?
S.Lott

Yanıtlar:


335

Hangi kod parçasının daha hızlı olduğunu şu şekilde test edebilirsiniz:

% python -mtimeit  "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop

% python -mtimeit  "l=list()"
1000000 loops, best of 3: 0.297 usec per loop

Bununla birlikte, uygulamada, bu başlatma büyük olasılıkla programınızın çok küçük bir kısmıdır, bu yüzden endişelenmek muhtemelen yanlış kafalıdır.

Okunabilirlik çok özneldir. Tercih ederim [], ama Alex Martelli gibi çok bilgili bazı insanlar tercih ediyor list()çünkü belirgin .


12
Vay canına, profilleme için teşekkürler. Her zaman nasıl yapıldığını bilmek istemiştim.
user225312

Neden list('')vermek []yerine ['']?
Chris_Rands

Bunun nedeni, bu işlev yinelenebilir türlerden liste oluşturmasıdır, 1'den fazla bağımsız değişken ekleyemezsiniz. ( list('abcd')
Yazmaya

133

list()doğal olarak daha yavaştır [], çünkü

  1. sembol araması var (sadece listeyi başka bir şey olarak yeniden tanımlamazsanız, python'un önceden bilmesinin bir yolu yok!),

  2. fonksiyon çağırma var,

  3. sonra tekrarlanabilir argüman olup olmadığını kontrol etmelidir (böylece ondan öğeler ile liste oluşturabilir) ps. bizim durumumuzda hiçbiri ama "if" kontrolü var

Çoğu durumda hız farkı pratik bir fark yaratmaz.


38
+1: Neden list()daha yavaş olduğunu anlamak iyi hissettiriyor []!
Eric O Lebigot

2
Bu durumda list()sadece herhangi bir argüman olup olmadığını kontrol etmek zorundadır ... "tekrarlanabilir olup olmadığını kontrol etmek" ve "elemanlarla liste oluşturmak" sadece gerçekleşmez; sadece arg varsa geçerlidir. Hatta C kodunun []aynı C kodunu çağırması bile mümkündür list(). Her durumda, (c) 'de yer alan süre, (a) + (b)' ye kıyasla çok az olacaktır.
John Machin

1
@John Machin - karışıklık için özür dilerim, (c) 'de kastettiğim, argüman olup olmadığını kontrol etmesi gerekecekti, evet. geri kalanı tartışma olsaydı ne olacaktı, bizim durumumuzda hiçbiri yoktu
Nas Banov

16

Ben kullanıyorum [].

  1. Daha hızlı çünkü liste gösterimi kısa devre.
  2. Bir liste oluşturma ile neden bir fark olmalı, öğeler olmadan bir listesini oluşturarak aynı hakkında görünmelidir?

3

Gerçekten bilmiyorum, ama bana göre, deneyime göre, jpcgt aslında doğru. Aşağıdaki örnek: Aşağıdaki kodu kullanırsam

t = [] # implicit instantiation
t = t.append(1)

yorumlayıcıda, t'yi çağırmak herhangi bir liste olmadan bana sadece "t" verir ve başka bir şey eklersem, ör.

t = t.append(2)

"'NoneType' nesnesinin 'append' özelliği yok" hatası alıyorum. Ancak, listeyi

t = list() # explicit instantiation

o zaman iyi çalışıyor.


15
Çünkü bu t.append(1)değiştirir tyerde, bu başka bir şey dönmez Noneve bu atamayacaksanız Noneiçin t. Yani tşimdi atıfta Noneyerine listeye. Buradaki hatanız t=t.append(1)sadece yerine yazmaktı t.append(1). Aynı davranışı fark edeceksiniz list(), bu yüzden burada bir fark yok.
Darkonaut

1

@Darkonaut cevabını vurgulamak için çünkü daha görünür olması gerektiğini düşünüyorum.

new_list = []ya new_list = list()hem ince (performansını görmezden), ancak append()döner Nonegibi yapamayacağınız sonuçlanabilir new_list = new_list.append(something.

Böyle bir geri dönüş tipi karardan çok şaşkınım. Yuck.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.