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 list
eler 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.