koddla

Yazılımcıları bilgi ile güçlendirir.

Python listelerde append ve extend arasındaki fark nedir?

  • append argümanını listenin sonuna tek bir öğe olarak ekler. Dolayısıyla listenin boyutu sadece bir artırılır.
  • extend argümanı üzerinde bir iterasyon oluşturur ve her öğeyi listeye ekler. Böylece listeyi genişletir. Listenin boyutu iterasyon kurulan argümanın sayısı kadar artar.

append

 list.append metodu listenin sonuna bir obje ekler.

my_list.append(object) 

Bu nesne ne olursa olsun, sayı, string, başka bir liste, ya da başka bir şey, my_list‘in sonuna tek bir öğe olarak eklenir.

>>> my_list
['foo', 'bar']
>>> my_list.append('baz')
>>> my_list
['foo', 'bar', 'baz']

Listenin bir nesne olduğunu unutmayın. Dolayısıyla listeye bir listeyi append edersek, eklediğimiz liste orijinal listenin sonunda tek bir nensne gibi görünür – ki bu istediğiniz şey olmayabilir:

>>> another_list = [1, 2, 3]
>>> my_list.append(another_list)
>>> my_list
['foo', 'bar', 'baz', [1, 2, 3]]
                     #^^^^^^^^^--- listenin sonunda tek bir öğe.

extend

list.extend metodu listeye yinelenebilir bir şekilde öğeleri ekler:

my_list.extend(iterable)

Dolayısıyla extend kullanarak listenin sonuna iterable öğesi kadar öğe eklenir:

>>> my_list
['foo', 'bar']
>>> another_list = [1, 2, 3]
>>> my_list.extend(another_list)
>>> my_list
['foo', 'bar', 1, 2, 3]

Burada dikkat etmeniz gereken nokta, string’in de bir yinelenebilir öğe olması. Dolayısıyla extend edildiğinde her karakter bir öğe olarak eklenir – ki bu da isteyeceğiniz bir şey olmayabilir:

>>> my_list.extend('baz')
>>> my_list
['foo', 'bar', 1, 2, 3, 'b', 'a', 'z']

Operator Overload, __add__ (+) ve __iadd__ (+=)

+ ve += operatörleri listeler için tanımlanmıştır. Bunlar semantik olarak extend’e benzerler.

my_list + another_list bellekte üçüncü biri list oluşturur. Böylece bu işlemin sonucunu döndürebiliriz. Ancak, ikinci yinelenebilir öğenin bir liste olması gerekir.

my_list += another_list listeyi yerinde değiştirir, dolayısıyla yeni bir liste oluşturmaz. Bu operatör de extend’e benzer şekilde çalışır, ikinci yinelenebilir öğenin bir liste olması gerekir.

Burada şunu karıştırmayın:  my_list = my_list + another_list yukarıdaki += kullanımına eş değer değildir. Bu kullanım yeni bir listenin my_list’e atanmasını sağlar.

append ve extend için zaman karmaşıklığı

append için zaman karmaşıklığı sabittir, O(1).

extend için ise O(k)’dır.

Birden fazla append çağrısı üzerinde yineleme yapmak karmaşıklığı artırır, ki böylece karmaşıklık extend’inkine eşit olur. extend’in iterasyon sistemi C ile yazıldığı için, birden fazla append kullanmak istiyorsanız extend’i kullanmak daha hızlı olacaktır.

Performans

Peki hangisi daha iyi performans gösterir? Aşağıdaki fonksiyonlar aynı işlemi yapıyorlar:

def append(alist, iterable):
    for item in iterable:
        alist.append(item)
        
def extend(alist, iterable):
    alist.extend(iterable)

Bu işlemler için zaman tutalım:

import timeit

>>> min(timeit.repeat(lambda: append([], "abcdefghijklmnopqrstuvwxyz")))
2.867846965789795
>>> min(timeit.repeat(lambda: extend([], "abcdefghijklmnopqrstuvwxyz")))
0.8060121536254883

extend oldukça hızlı.

Peki sadece bir öğenin eklendiği bir örnek için zaman tutsaydık?

Burada semantik olarak doğru olanı yapmak önemli. Eğer birden fazla öğe ekleyeceksek – iterasyon ile – o zaman extend‘i kullanmalıyız. Eğer bir öğe ekleyeceksek append‘i.

Zaman tutarak bunun nasıl çalıştığına bakalım:

def append_one(a_list, element):
    a_list.append(element)

def extend_one(a_list, element):
    a_list.extend([element])

import timeit

Sonuca bakarsak append burada daha hızlı çalıştı:

>>> min(timeit.repeat(lambda: append_one([], 0)))
0.2082819009956438
>>> min(timeit.repeat(lambda: extend_one([], 0)))
0.2397019260097295

Sonuçlara göre tek bir öğemiz varsa extend kullanarak bir şey kazanmıyoruz.

Bununla birlikte, zaman tutmak her zaman önemli olmayabilir. Burada tuttuğumuz zamanları göstererek şunu söylemek istiyoruz: Python’da semantik olarak doğru şeyi yapmak yapmak istediğimiz şeyin doğru yöntemidir.

Zaman tutarak hangi işlemin daha hızlı olacağını anlamak mantıklı olsa da sadece semantik olarak doğru olan şeye odaklanmak da yeterli olacaktır.

Kısaca append vs extend

Bu bilgiler ile şimdi şunu söyleyebiliriz:

1) append ve extend arasındaki fark:

append:

  • herhangi bir Python nesnesini olduğu gibi listenin sonuna ekler
  • Elde edilen liste içerisinde başka bir listeyi içerir hale gelebilir veya farklı türleri içerebilir (list, string, tuple, dictionary, set, vb.)

extend:

  • Herhangi bir yinelenebilir öğeyi kabul eder ve listeyi büyütür
  • Elde edilen liste her zaman tek boyutludur (iç içe liste oluşturmaz) ve farklı türleri içerebilir (karakter, integers, float).

2) append ve extend arasındaki benzerlikler

  • İkisi de sadece tek argüman alır
  • listeyi yerinde değiştirirler
  • None döndürürler.

Sonuç

Görüldüğü gibi extend semantik olarak daha temiz çalışır, ve append‘e kıyasla eğer bir yinelenebilir nesne kullanarak ekleme yapacaksak daha hızlıdır.

Sadece tek bir öğeyi listeye eklemek istiyorsak ise append daha verimlidir.

Bir yanıt yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top