Python Programming

Vektörleştirilmiş Pandas vs NumPy: Büyük Ölçekli Veri Dönüşümü İçin Performans Testleri

Python'da veri mühendisliği ve bilimsel hesaplamalar alanında, Pandas ile NumPy arasındaki seçim genellikle kolaylık ile ham hesaplama hızı arasında ince bir denge kurmaktan ibarettir. Orta ve ileri düzey geliştiriciler için, uygulamaları milyonlarca satır veya terabayt veri işleyecek şekilde ölçeklendirirken bu iki kütüphanenin altta yatan mekaniklerini anlamak kritik öneme sahiptir. Bu yazı, vektörleştirilmiş işlemlerin yürütülmesi sırasında ortaya çıkan performans farklılıklarını incelemekte, veri borularınızı (pipelines) optimize etmenize yardımcı olacak eyleme geçirilebilir test sonuçları ve kod örnekleri sunmaktadır.

Temel: Vektörleştirme Açıklaması

Hem Pandas hem de NumPy, yüksek performans elde etmek için vektörleştirmeye dayanır. Vektörleştirme, açık Python döngülerini optimize edilmiş C seviyesindeki işlemlerle değiştirir. Bir dizi veya Seride (Series) bir işlem gerçekleştirdiğinizde, bu işlem tüm elemanlara aynı anda uygulanır ve CPU SIMD (Tek Talimat, Çoklu Veri) talimatlarından yararlanılır. Bu yaklaşım, yinelemeli görevler için ünlü derecede yavaş olan Python yorumlayıcı döngüsünün yükünü (overhead) ortadan kaldırır.

Bununla birlikte, Pandas NumPy'nin üzerine inşa edilmiştir. Bu, Pandas'ın güçlü indeksleme ve eksik veri işleme özelliklerine sahip DataFrames gibi yüksek seviyeli veri yapıları sunduğu anlamına gelir; ancak Pandas'taki her işlem nihayetinde NumPy dizilerine yönlendirilir. Soru şudur: Pandas'ın ek soyutlama katmanı, kullanımını haklı çıkarmak için yeterli yükü mü getirir, yoksa maksimum hız için ham NumPy'ye mi bağlı kalmalısınız?

Test Metodolojisi

Adil bir karşılaştırma sağlamak için, iki yaygın veri dönüşüm görevini test edeceğiz:

  1. Eleman Bazlı Aritmetik: Büyük bir veri setindeki her bir elemana sabit bir değer ekleme.
  2. Karmaşık Aggregasyon: Devasa bir veri seti üzerinde ağırlıklı ortalama hesaplama.

Mikro optimizasyonların makro düzeyde farklara dönüşmesini sağlamak için 10 milyon satırlık bir veri seti kullanacağız. Test, saf NumPy dizilerine karşılık gelen Pandas Serileri/DataFrames'lerin yürütme süresini ölçer.

Test 1: Eleman Bazlı İşlemler

Basit bir toplama işlemiyle başlayalım. Bu senaryoda, 10 milyon tamsayıdan oluşan bir veri setindeki her bir elemana 10 ekliyoruz.

import numpy as np
import pandas as pd
import time

# Veri oluştur
n_rows = 10_000_000
np_data = np.random.rand(n_rows)
pd_data = pd.Series(np_data)

# NumPy test et
start = time.time()
np_result = np_data + 10
np_time = time.time() - start

# Pandas test et
start = time.time()
pd_result = pd_data + 10
pd_time = time.time() - start

print(f"NumPy Süresi: {np_time:.5f} saniye")
print(f"Pandas Süresi: {pd_time:.5f} saniye")

Sonuçlar: Eleman bazlı işlemlerde NumPy, genellikle Pandas'tan %10 ila %20 daha hızlı çalışır. Pandas'taki gecikme, basit aritmetik işlemler gerçekleştirilirken bile indeks hizalama kontrolleri ve tür çıkarımından kaynaklanır. Ancak bu fark, G/Ç (I/O) ile sınırlı görevler bağlamında genellikle ihmal edilebilir düzeydedir.

Test 2: Koşullu Mantık ve Filtreleme

Boolean bir maskeye dayalı olarak verileri filtreleme gibi koşullu mantık, daha belirgin farklılıklar ortaya çıkarır. Pandas'ın loc erişimcisi kullanışlıdır ancak NumPy'nin boolean indekslemesine kıyasla bazı ek yükler içerir.

# 0.5'ten büyük değerleri filtrele
start = time.time()
np_filtered = np_data[np_data > 0.5]
np_filter_time = time.time() - start

start = time.time()
pd_filtered = pd_data[pd_data > 0.5]
pd_filter_time = time.time() - start

print(f"NumPy Filtreleme Süresi: {np_filter_time:.5f} saniye")
print(f"Pandas Filtreleme Süresi: {pd_filter_time:.5f} saniye")

Sonuçlar: Burada performans açığı daha da genişler. NumPy'nin boolean indekslemesi son derece optimize edilmiştir ve doğrudan bellek erişim desenlerine haritalanır. Pandas, Serinin indeksini yönetmek zorundadır; bu da özellikle indeks ardışık değilse veya karmaşık bir türdeyse süreci yavaşlatabilir. Saf hesaplama verimliliği açısından NumPy açık ara kazanır.

Hangisini Ne Zaman Kullanmalı?

NumPy genel olarak ham sayısal hesaplamalar için daha hızlı olsa da, Pandas gerçek dünya veri manipülasyonu için vazgeçilmez olan özellikler sunar. Bunlar şunlardır:

  • Karmaşık Veri Tipleri: Metinleri, tarihleri ve sayıları birlikte işleme.
  • Eksik Veri: NaN değerleri için yerleşik işleme.
  • Veri Bütünlüğü: Daha güçlü veri doğrulama ve tür zorlaması.
  • Araç Ekosistemi: Matplotlib, Scikit-Learn ve SQL veritabanlarıyla sorunsuz entegrasyon.

Verileriniz homojense ve tamamen sayısal ise ve bellek kısıtlı bir ortamda çalışıyorsanız NumPy kullanmayı düşünün. Dağınık, gerçek dünya verilerini içeren çoğu veri bilimi iş akışları için Pandas'ın küçük performans kaybı, üretkenlik ve sürdürülebilirlikteki kazanımlar karşılığında değerlidir.

Sonuç

Vektörleştirilmiş Pandas ve NumPy arasındaki tartışma, hangisinin "daha iyi" olduğu değil, spesifik kullanım durumunuz için hangisinin daha uygun olduğu üzerinedir. Homojen veriler üzerinde yoğun sayısal hesaplama için NumPy, üstün hız ve bellek verimliliği sağlar. Karmaşık veri temizleme, karmaşık veri setleri ve kullanım kolaylığı için Pandas ise sektör standardı olmaya devam etmektedir.

Veri setleriniz büyüdükçe, darboğazları belirlemek için kodunuzu profillemeyi düşünün. Sıklıkla en büyük kazanımlar, NumPy ve Pandas arasında mikro optimizasyon yapmak yerine, G/Ç işlemlerini optimize etmekten veya paralel işleme için Polars veya Dask gibi araçları kullanmaktan gelir. Ancak, bu temel farklılıkları anlamak, verilerinizle birlikte ölçeklenebilmesi için bilinçli kararlar almanızı sağlar.

Share: