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 np
2import time
3
4# Test verisi: 1 milyon eleman
5array_a = np.random.rand(1_000_000)
6array_b = np.random.rand(1_000_000)
7
8# Yöntem 1: For döngüsü (YAŞLI YÖL)
9start = time.time()
10result_loop = 0
11for i in range(len(array_a)):
12result_loop += array_a[i] * array_b[i]
13loop_time = time.time() - start
14
15# Yöntem 2: Vektörleştirme (HIZLI YÖL)
16start = time.time()
17result_vec = np.dot(array_a, array_b)
18vec_time = time.time() - start
19
20print(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 saniye
2Vektör süresi: 0.0015 saniye
3Hız artışı: 189x
4Sonuçlar eşit mi? True

Gö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ı.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

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']
5
6# Broadcasting ile ölçekleme
7matrix = np.array([[1, 2], [3, 4]])
8scaled = matrix * 10 # Her elemanı 10 ile çarp
9print(scaled)
10
11# Satır/sütun işlemleri
12data = 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz