Geçenlerde bir veri setindeki benzersiz kombinasyonları bulmam gerekiyordu. Klasik, "kendini tekrar etme, Stack Overflow'a git" refleksi. "Find unique pairs in list" diye arattım, ilk çıkan cevaptaki `itertools.combinations` kullanan kodu gördüm. "Aha, işte bu!" dedim, kopyala-yapıştır, biraz parametre değiştir, çalıştır. Test ettiğim küçük örnek listemde mükemmel çalıştı. Gönderdim, keyfim yerinde.
Ertesi gün, canlı sistemden gelen gerçek veriyle scripti çalıştırdım. Bellek kullanımı anormal şekilde fırladı ve MemoryError ile yüzleştim. Kafayı yiyecektim! Meğerse o kopyala-yapıştır kod, tüm kombinasyonları bir listeye atıp sonra `set()`'e çeviriyormuş. Küçük veride sorun yok ama 100k elemanlı bir listede itertools.combinations'ın üreteceği kombinasyon sayısı akıl almaz boyutta. Direkt patladı.
Python:
# O lanet olası kopyala-yapıştır kod:
from itertools import combinations
all_pairs = list(combinations(huge_list, 2)) # BU SATIR ÖLDÜRÜYOR!
unique_pairs = set(all_pairs)
Stack Overflow'daki cevabın altına inip yorumları okuduğumda, birinin "Büyük listeler için bu bellek dostu değil" diye yazdığını gördüm. Meğerse cevap 10 puanlık, o yorum ise -1 puanlıkmış ve gözden kaçmış. Asıl çözüm, kombinasyonları üretirken hemen işleyip atmak veya `generator` yapısını bozmadan `set`'e beslemekti.
Python:
# Hafızaya saygı duyan çözüm:
unique_pairs = set()
for a, b in combinations(huge_list, 2):
unique_pairs.add((a, b)) # Veya tuple'ı sıralayıp ekle
Moralim: Stack Overflow kutsal bir kaynak değil, bir fikir kaynağı. Her kodu olduğu gibi alıp, özellikle edge case'leri (boş liste, çok büyük veri, tuhaf karakterler) mutlaka test etmek lazım. Oradaki en yüksek puanlı cevap, senin senaryon için en iyisi olmayabilir.
Siz de hiç "çalışıyor" diye sevinip, sonra edge case'de yüzünüze patlayan kopyala-yapıştır kodlar yaşadınız mı? Bu tür bellek tuzaklarına karşı favori kontrol listeniz var mı?