NumPy'da Vektörleştirme: Döngüden Hızlı Hesaplamaya
Çoğu Python programcısı NumPy ile çalışırken klasik for döngüsüne başvuruyor. Ama bu yol, özellikle büyük veri setlerinde sizi aylarca gecikmeli raporlarla karşı karşıya bırakabilir. Vektörleştirme işte burada devreye giriyor, NumPy'ın C kütüphanesine doğrudan erişim sağlayan yöntemi.
Bir örnek üzerinden gidelim. Diyelim 1 milyon sayıdan oluşan iki array'i eleman eleman çarpıp toplamak istiyorsun.
1import numpy as np2import time34# Test verisi: 1 milyon eleman5array_a = np.random.rand(1_000_000)6array_b = np.random.rand(1_000_000)78# Yöntem 1: For döngüsü (YAŞLI YÖL)9start = time.time()10result_loop = 011for i in range(len(array_a)):12result_loop += array_a[i] * array_b[i]13loop_time = time.time() - start1415# Yöntem 2: Vektörleştirme (HIZLI YÖL)16start = time.time()17result_vec = np.dot(array_a, array_b)18vec_time = time.time() - start1920print(f"Döngü süresi: {loop_time:.4f} saniye")21print(f"Vektör süresi: {vec_time:.6f} saniye")22print(f"Hız artışı: {loop_time / vec_time:.0f}x")23print(f"Sonuçlar eşit mi? {np.isclose(result_loop, result_vec)}")Çıktı:
1Döngü süresi: 0.2847 saniye2Vektör süresi: 0.0015 saniye3Hız artışı: 189x4Sonuçlar eşit mi? TrueGördüğün gibi vektörleştirme 189 kat daha hızlı. Bunun sebebi NumPy'ın operasyonları C seviyesinde paralel olarak çalıştırması, Python yorumlayıcısının yavaş döngü işlemesinden kaçınması.
Başka yaygın vektörleştirme örnekleri:
1# Şartlı işlem (np.where)2scores = np.array([45, 78, 92, 34, 88])3passed = np.where(scores >= 70, "Geçti", "Kaldı")4print(passed) # ['Kaldı' 'Geçti' 'Geçti' 'Kaldı' 'Geçti']56# Broadcasting ile ölçekleme7matrix = np.array([[1, 2], [3, 4]])8scaled = matrix * 10 # Her elemanı 10 ile çarp9print(scaled)1011# Satır/sütun işlemleri12data = np.array([[1, 2, 3], [4, 5, 6]])13row_means = np.mean(data, axis=1)14print(row_means) # [2. 5.]Sık yapılan hata: Vektörleştirmek için kodu "NumPy'ı kullan" şeklinde değiştirmek yeterli değil. `np.sum()` yerine `sum()` kullanmak veya `astype()` sonrası döngüye girmek hızı geri getirir. Ayrıca çok büyük ara array'ler oluşturmaktan kaçın, bellek tükenir.
Vektörleştirme NumPy'ın ruhu. Döngü yazarken "bunu vektör olarak yazabilir miyim?" diye sor. Çoğu zaman cevap evet, ve kodun hem hızı hem okunabilirliği artar.
0 yorum