Dostlar, itiraf zamanı. Bir algoritma düşünürken veya mülakatta bir soruya cevap verirken, aklıma ilk gelen şey hep time complexity. "Bu işlem O(n^2) mi, O(n log n) mi?" diye kafamı yoruyorum ama space complexity aklıma sonra geliyor, hatta bazen hiç gelmiyor. Sanki hafıza bedava, RAM'ler uçuyormuş gibi kod yazıyorum. Sizde de böyle mi?
Geçenlerde basit bir işlem için recursive bir fonksiyon yazmıştım. Fonksiyon güzel çalışıyordu, zaman açısından da verimliydi. Ta ki, biraz büyük bir input verene kadar.
Python:
def fibonacci_naive(n):
if n <= 1:
return n
return fibonacci_naive(n-1) + fibonacci_naive(n-2)
Bu kodu görünce hepiniz "Eyvah!" dediniz değil mi? Zaman karmaşıklığı berbattı evet, ama beni asıl yıkan, stack'in O(2^n) seviyesinde call ile dolup taşması ve programın "RecursionError" diye haykırması oldu. O an fark ettim ki, ben sadece ekrandaki sonucun ne zaman geleceğine odaklanmışım, bilgisayarın içinde neler olduğuna hiç bakmamışım.
Bir başka yaygın hata: Kodu "temiz" ve "okunabilir" yapayım derken, gereksiz yere yeni listeler, dictionary'ler oluşturmak. Mesela, bir listeyi filtreleyip yeni bir liste döndüren bir fonksiyon yazdığımızı düşünelim. İç içe iki list comprehension kullanıp, aslında tek seferde halledilebilecek bir işi, iki katı memory kullanarak yapabiliyoruz. Input küçükken sorun yok, ama işler büyüyünce o masum görünen ek liste, performansı ciddi etkileyebiliyor.
Şimdi kendimi eğitmeye çalışıyorum. Bir veri yapısı seçerken (Array mi, LinkedList mi?) veya bir algoritma tasarlarken şu soruları sormaya başladım:
Bu ekstra hash table, ne kadar yer kaplayacak?
Recursive çözüm, call stack'imi şişirir mi?
Burada in-place bir işlem yapabilir miyim, yoksa yeni bir obje mi oluşturuyorum?
Özellikle embedded sistemler, mobil uygulamalar veya büyük veri işlerinde, space complexity'nin time'dan daha kritik olabildiğini fark ettim. CPU hızlı, ama RAM doluysa hiçbir şey yapamazsın.
Peki ya siz? Siz de benim gibi space complexity'yi hep ikinci plana atanlardan mısınız? Yoksa "memory-first" diyerek mi kod yazıyorsunuz? Büyük veriyle uğraşırken space için kullandığınız ilginç taktikler var mı? Anlatın da öğrenelim!