Tembel ve Açgözlü İşlemlerin Dengesi
Tembel değerlendirmenin ne zaman yararlı veya zararlı olduğunu bilin.
Tembel ve Açgözlü İşlemlerin Dengesi, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.
Bedava Öğle Yemeği Yok
Tembel değerlendirme her zaman daha hızlı değildir. Önceden bellek ayırma işlemini erişim başına ek yükle takas eder ve yan etkilerin ne zaman çalışacağını değiştirir. Bu ödünleşimleri bilmek doğru seçimi yapmanızı sağlar.
Tembel Kazanır: Kısmi Tüketim
Büyük bir dönüşümün yalnızca bir dilimi gerekiyor — tembel yaklaşım geri kalanını atlar:
let data = Array(1...1_000_000)
let top = data.lazy.map { $0 * 2 }.prefix(3)
print(Array(top)) // [2, 4, 6] -- 999,997 transforms skippedeager Kazanır: Tamamen Yeniden Kullanım
Sonucu birçok kez yinelerseniz eager bir kez hesaplar; tembel yaklaşım ise her geçişte yeniden hesaplar:
let doubled = [1, 2, 3].map { $0 * 2 } // computed once
print(doubled.reduce(0, +)) // 12
print(doubled.max()!) // 6 -- no recomputeTembel Yaklaşım Yeniden Hesaplar
Aynı tembel görünüm, her yinelemede işi yeniden yapar:
var work = 0
let view = [1, 2, 3].lazy.map { (n: Int) -> Int in work += 1; return n }
_ = view.reduce(0, +)
_ = view.max()
print(work) // 6 -- transformed twiceÖğe Başına Ek Yük
Her tembel adım, diziyi başka bir türle sarar ve her öğe için closures üzerinden çağrı yapar. Çok küçük dizilerde bu ek yük, tasarruf edilen bellek ayırma işlemini aşabilir.
Küçük Dizi, eager Uygundur
Tamamen tüketilen az sayıdaki öğe için yalın eager yaklaşımı tercih edin — daha basittir ve bellek ayırma işlemi önemsizdir:
let nums = [3, 1, 2]
let sorted = nums.map { $0 + 1 }.sorted()
print(sorted) // [2, 3, 4]Yan Etkilerin Zamanlaması Farklıdır
Tembel yaklaşımda kapanış gövdesi, onu tanımlayan satırdan daha sonra çalışır. Tembel dönüşümlerin içindeki yan etkilere güvenmekten kaçının:
var log: [Int] = []
let v = [1, 2].lazy.map { (n: Int) -> Int in log.append(n); return n }
print(log) // [] -- nothing ran yet
_ = Array(v)
print(log) // [1, 2]eager Değerlendirmeyi Zorlayan İşlemler
Bazı işlemlerin zaten tüm diziyi okuması gerekir; bu nedenle tembel yaklaşım burada hiçbir yarar sağlamaz:
let nums = Array(1...10)
print(nums.lazy.map { $0 * 2 }.sorted()) // sorted must see all -> [2,4,...,20]
print(nums.lazy.map { $0 }.count) // count walks everythingTembel Yaklaşımla İçerme Denetimi
Büyük girdilerde contains(where:) gibi kısa devreli işlemler tembel yaklaşımdan yararlanır:
let big = Array(1...1_000_000)
let found = big.lazy.map { $0 * 2 }.contains { $0 == 8 }
print(found) // true -- stops at element 4Karar Kontrol Listesi
Şu durumlarda tembel yaklaşımı kullanın: kaynak büyükse AND yalnızca bir bölümünü (prefix / first / içerme denetimi) tutuyorsanız AND bir kez yineliyorsanız. Şu durumlarda eager kullanın: dizi küçükse, sonucu yeniden kullanıyorsanız veya okunabilirlik mikro optimizasyondan daha önemliyse.
let huge = Array(1...100_000)
let first = huge.lazy.filter { $0 % 9973 == 0 }.first
print(first!) // 9973Tahmin Etmeyin, Ölçün
Performans sezgisi çoğu zaman yanılır. Önemli olduğunda, tembel yaklaşımı kullanmaya karar vermeden önce gerçekçi verilerle her iki sürümün performansını ölçün.
let nums = Array(1...50)
let eager = nums.filter { $0 > 25 }.count
let lazyC = nums.lazy.filter { $0 > 25 }.count
print(eager == lazyC) // true -- same answer, profile for speedHızlı Kontrol
lazy yerine eager ne zaman daha iyi bir seçimdir?
Özet
Ödünleşimleri öğrendiniz:
- Tembel yaklaşım, büyük kaynaklarda kısmi ve tek geçişli tüketimde avantajlıdır
- eager, küçük dizilerde ve yeniden kullanılan sonuçlarda avantajlıdır (tembel yaklaşım yeniden hesaplar)
- Tembel dönüşümlerdeki yan etkiler daha sonra çalışır — bunlara güvenmekten kaçının
- Optimize etmeden önce ölçün
Sırada: özel tembel diziler oluşturmak var.
Sıkça Sorulan Sorular
“Tembel ve Açgözlü İşlemlerin Dengesi” dersi ücretsiz mi?
Evet — “Tembel ve Açgözlü İşlemlerin Dengesi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.
“Tembel ve Açgözlü İşlemlerin Dengesi” dersinde ne öğreneceğim?
Tembel değerlendirmenin ne zaman yararlı veya zararlı olduğunu bilin. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Swift Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Tembel ve Açgözlü İşlemlerin Dengesi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- lazy Özelliği
- Tembel map ve filter
- Tembel ve Açgözlü İşlemlerin Dengesi
- Özel Tembel Diziler Oluşturma