NumPy Python topluluğunun sıkça kullandığı çok güçlü bir kütüphane. Bu kadar güçlü olmasına karşın temel özellikleri taşıyan bir kütüphane olmayı amaçladığından matematikle ilgili her fonksiyonu bulmanız mümkün değil. Kendi kişisel işleminiz için ihtiyaç duyduğunuz fonksiyonları bulamadığınızda bunları UFunc özelliğinden yararlanarak C arkaplanında gerçekleyerek NumPy uyumlu bir modül oluşturabilirsiniz. Bu sayede, NumPy Broadcasting gibi tekniklerle array manipülasyonlarını kolayca gerçekleştirebilir ve hızlı C altyapısının keyfini çıkarmaya devam edebilirsiniz.
Python UFunc Şablonu
Bir çok UFunc aşağıdaki şablonu kullanır. Siz de kendi UFunc fonksiyonunuzu yazarken bu şablon üzerinden gidebilirsiniz.
Dikkat edilmesi gereken kısımları aşağıda belirteceğim.
En yukarıdaki PyMethodDef dizgesi aşağıdaki tipte elemanlardan oluşan bir listedir. Burada kaç fonksiyonunuz varsa o kadar eleman olmalı.
Sonra asıl iş yapan fonksiyonun tanımı başlıyor.
Bunu ardından fonksiyon girdilerinin ve çıktılarının tipleri belirlenir.
Bu aşamadan sonra artık fonksiyon tanımı biter ve modül tanımı başlar.
Burada kod
#ifdefile ikiye bölünmüş. Bunun sebebi Python versiyonunu kontrol etmektir. Yazdığınız NumPy fonksiyonunu hem Python 2'de hem de Python 3'de çalışmasını sağlar.
PyMODINIT_FUNC PyInit_npufunc(void)satırı kodunuz için bir giriş noktasıdır (Tıpkı normal C programlarındaki main gibi). Burada içeride sırasıyla
- Modül oluşturulur.
- Kullanılacak modüller dahil edilir.
- Yukarıdaki fonksiyondan UFunc oluşturulur.
- UFunc modüle dahil edilir.
Softmax UFunc
Yukarıda gördüğümüz şablonun nasıl kullanıldığını görmek adına bir Softmax fonksiyonu modülü yazalım.
Softmax fonksiyonunu NumPy ile gerçekleyelim.
Yukarıdaki şablonda ismi "custom" ile başlayan yerleri kendi fonksiyon isimlerimizle değiştirip, istediğimiz fonksiyonu gerçekledikten sonra aşağıdaki kodu elde ettik.
Setupfile
Her modül gibi yazacağımız modül de bir Setupfile manifestosuna ihtiyaç duyuyor. Aşağıda setup.py isimli dosyanın içeriğine göz atalım.
Bu Setupfile manifestosu ile modülümüzü kurmak için
sudo python setup.py installBu paketin kurulduğu klasöre gidip boş bir __init__.py dosyası oluşturmanız gerekiyor.
Oluşturduğumuz fonksiyonu Python kodu içinde çağıralım:
Bu iki fonksiyon için performans karşılaştırması yapacak olursak aslında aralarında çok bir fark olmadığını görürüz. 100K elemanlı dizgelerde bile çok küçük performans kazancı var. Bunun sebebi Python kısmında kullandığımız Exp ve Sum fonksiyonlarının kendilerinin de UFunc olması. Bu yüzden C kodunun hızından kendileri de yararlanıyorlar. Bu durumda Python ile vektörize yazabildiğimiz Softmax gibi işlemler için UFunc oluşturmaya gerek kalmıyor.
Bir başka yazıda görüşmek üzere.