Python'da, listelerin kapasitesi dinamik olarak artabilir. Bir liste oluşturduğunuzda, Python başlangıçta belirli bir kapasiteye sahip bir hafıza bloğu ayırır. Liste kapasitesi dolduğunda ve yeni bir eleman eklenmeye çalışıldığında, Python daha büyük bir hafıza bloğu ayırır ve eski elemanları yeni hafıza bloğuna kopyalar. Bu, dinamik bir diziye veya listeye bir örnektir.
Amortizasyon, bir veri yapısının zaman karmaşıklığının uzun vadede nasıl değiştiğini inceleyen bir analiz türüdür. Python listelerinin dinamik büyümesi amortize zaman karmaşıklığı kavramıyla doğrudan ilgilidir. Bu, listeye bir eleman ekleme işleminin tipik olarak sabit zaman alacağı, ancak ara sıra (liste kapasitesi dolu olduğunda ve yeni hafıza bloğu ayırmak gerektiğinde) bu işlemin daha fazla zaman alacağı anlamına gelir.
Ancak, bu yavaş işlemler o kadar nadiren gerçekleşir ki, ekleme işlemi genellikle sabit zamanlı olarak kabul edilir. Başka bir deyişle, n eleman eklediğinizde toplam süre O(n) olur, bu da ortalama her ekleme işleminin O(1) zaman aldığı anlamına gelir. Bu, ekleme işleminin amortize zaman karmaşıklığının O(1) olduğunu gösterir.
Dinamik diziler ve amortizasyon kavramı, veri yapılarının etkinliğini ve performansını anlama açısından önemlidir. Bu kavramlar, bilgisayar biliminde ve yazılım mühendisliğinde yaygın olarak kullanılır.
dynamic_array = [] for i in range(100): dynamic_array.append(i) print(f"Length: {len(dynamic_array)}, Capacity: {dynamic_array.__sizeof__()}")
Bu kod, bir diziye 100 eleman ekler ve her ekleme sonrası dizinin mevcut boyutunu ve kapasitesini yazdırır. append() işlemi, Python listesinin dinamik bir dizi olduğunu ve kapasitesinin gerektiğinde otomatik olarak genişletildiğini gösterir.
__sizeof__() işlevi, bir Python nesnesinin bellekte ne kadar yer kapladığını döndürür. Python listesi için, bu genellikle verilerin kendisi ve liste veri yapısının yönetimi için ek hafıza dahil olmak üzere listeye ayrılan toplam hafiza miktarını temsil eder.
Not: Yukarıdaki kodun çıktısını okurken, boyut ve kapasitenin her zaman aynı olmadığını göreceksiniz. Kapasite genellikle boyuttan daha büyük olacaktır, çünkü Python genellikle bir sonraki append çağrıları için ekstra alan ayırır, böylece her ekleme için yeni bir hafıza bloğu ayırmak zorunda kalmaz. Bu, amortize zaman karmaşıklığını O(1) seviyesinde tutar. Bu örnek, dinamik dizilerin ve amortizasyonun temel konseptlerini göstermektedir.