ProgramlamaPython Geliştirici

Python'daki listeler ve tuple'lar için bellek yöneticilerinin çalışma prensiplerini açıklayın. Liste ve tuple'daki öğeleri değiştirme/ekleme arasındaki farklar nelerdir ve bu durum performansı nasıl etkiler?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Python'da listeler (list) değiştirilebilir yapılar, tuple'lar (tuple) ise değiştirilemez.

  • list: Yeni öğeler eklenirken (append, extend, insert) Python, dizinin büyümesini minimize etmek için bellek bloğunu "fazladan" ayırır ("over-allocation strategy"). Öğeleri kaldırmak (pop, remove) hızlıdır, ancak bazen bellek yeniden dağıtımına sebep olabilir.
  • tuple: Tuple boyutu sabittir, öğeleri değiştirmek veya eklemek mümkün değildir — bu, okuma işlemlerinin yüksek hızını ve bellek tüketiminin daha az olmasını sağlar; bu durum, büyük miktarda değiştirilemez veri depolarken listelere göre daha avantajlıdır.

list ve tuple'ı değiştirmeyi gösteren bir örnek:

lst = [1, 2, 3] lst.append(4) # TAMAM lst[1] = 20 # TAMAM tup = (1, 2, 3) tup[1] = 20 # TypeError

Performans:

  • Listeler sıkça değişen koleksiyonlar için mükemmeldir.
  • Tuple'lar, sabit boyut ve hashing prensipleri sayesinde, bellek açısından daha optimize olmuş, daha hızlıdır; biçiminde, anahtarlar olarak kullanılabilir veya fonksiyonlardan döndürülen değerler (değiştirilemez veri) için uygundur.

Kandırmaca Soru

Soru: Listeye öğe ekleme işlemleri genellikle neden hızlı (O(1)) bir şekilde gerçekleştirilir, eğer bu bir dizi bağlamında bellek yeniden dağıtımına yol açması gerekiyorsa?

Cevap:

Python, birkaç öğe için "fazladan bellek ayırarak" dinamik diziler uygular. Bu nedenle append genellikle O(1) alır ve bellek yeniden dağıtımı yalnızca yedek bloğun gerçekten tükenmesi durumunda gerçekleşir.

Örnek:

import sys lst = [] for i in range(10): lst.append(i) print(len(lst), sys.getsizeof(lst)) # Bellek boyutu kesinlikle doğrusal olarak artmıyor

Tarihçe

Örnek 1

Bir projede sözlük anahtarları için list kullanıldı. Geliştirici, listelerin hash'e yapılamadığını (değiştirilebilirlik) bilmiyordu, bu da "TypeError: unhashable type: 'list'" hatasına yol açtı.


Örnek 2

Geliştirici, uzun listeleri sıkça + ile birleştirerek oluşturuyordu. Bu, dizinin ek kopyalarına ve yüksek bellek ile zaman maliyetine yol açıyordu. Döngü içinde append kullanmak veya üreteçler kullanmak daha etkili olurdu.


Örnek 3

Bir kayıt sistemi için zaman damgalarını depolamak amacıyla tuple'lar seçildi, değiştirilemez oldukları için daha hızlı olacağı düşünüldü. Ancak, zaman zaman değişiklik yapma ihtiyacı doğdu; bu da sürekli yeni tuple'lar yaratmayı (copy-on-write) gerektirdi ve performansı listelere göre yavaşlattı.