Öncelikle 1.yazımı okumadıysanız ,onu okumanız çok daha iyi olacaktır .(Çünkü bu bir yazı serisi) 1.yazıya ” https://blog.ictr.club/devreden-veriye-part-1/ ” bu linkten ulaşabilirsiniz.Okumak istemezseniz özet geçeyim ,Can Oğuz hocamla bağımsız şekilde beraber uygulama geliştiriyoruz,planlarını hazırladım ,şuan projeyi oluşturmaya başladık.
Bugün odaklandığımız şey ise yazdığımız fonksiyonların hızlı çalıştırmak bunun için 2 yöntem anlatacağım.
UYGULAMA
Uygulamayı geliştirmeden önce bizim dikkat etmemiz gereken en önemli 3 kıstası yazalım.(Yoksa veri analizinden tut, web sayfasının responsive olmasıda önemli)
- Veri Akışı
- Hesap-Kitabın hızlı olması
- Geliştireceğimiz Yan Uygulamaların kendine özel kıstaslardaki kalitesi(Web sayfaları hızlı yüklenmeli veya verileri daha hızlı işlemek için daha doğru veri yapıları kullanmak gerek)
C/C++ İLE PYTHON BERABER KULLANMAK
Şimdi elimizdeki veri büyüdüğünde hesaplamalar zorlaşabilir veya imkanlarımız olduğunda ise daha güçlü diller kullanacağız.Ayrıca her iki dilin avantajından neden vazgeçelim.Python’un kolaylığı , c/c++ gücünü beraber kullanabiliriz.Şimdi ise kullanıma geçelim.
1.YÖNTEM(GCC ile Shared library KULLANIMI)
C++ ÖRNEĞİ
Örnek olarak bir c++ fonksiyonunu pythona shared library olarak paylaşıp python içerisinde kullanalım.
1.functions.cpp burayada fonksiyonları yazalım,2 sayıyı toplayan bir fonksiyon yazalım.
1 2 3 4 5 6 7 8 |
#include "head.hpp" int addition (int a, int b) { int r; r=a+b; return r; } |
2.head.hpp dosyası oluşturun.Burada amaç ise kullandığım kütüphaneleri kullanmak,not:pythonda ctypes kullanacağımız için c++ fonksiyonunu c fonksiyonu olarak deklare edeceğiz.
1 2 3 4 5 6 7 8 9 |
#ifndef ADDITION #define ADDITION #include <math.h> extern "C" int addition (int a, int b); #endif |
Linux için aşağıdaki komutları yazalım.Not:windows kullananlar dll tercih tercih etmeliyiz
1 2 |
g++ -c -Wall -Werror -O3 -fpic functions.cpp head.hpp g++ -shared -Wall -Werror -O3 -o lib.so functions.o |
Ardından python app.py adında dosyamızı oluşturup bu fonksiyonu yazalım.
1 2 3 4 5 6 7 8 9 10 |
from ctypes import cdll # kütüphane yükleyelim lib = cdll.LoadLibrary('./lib.so') print("2 sayi gir") a,b=int(input()),int(input()) result=lib.addition(a,b) print("toplam ",result) |
Son olarak python dosyamızı çalıştıralım,”python app.py” yazalım ve sonucu görelim.
1 2 3 4 |
2 sayi gir 1 2 toplam 3 |
C ÖRNEĞİ
Şimdi ise c için 2 sayıyı çarpan bir uygulama yazalım,ilk olarak dosya ismi olarak cfunc.c adında bir dosya oluşturup aşağıdaki fonksiyonu yazalım.
1 2 3 |
int product(int a ,int b){ return a*b; } |
Aynı şekilde komutları aynı şekilde yazalım,mylib.so adında başka bir kütüphane oluşturalım.
1 |
gcc -o mylib.so --shared -fPIC cfunc.c |
Bu örnek için başka bir python dosyası oluşturalım ve çalıştıralım.
1 2 3 4 5 6 7 8 9 |
from ctypes import cdll lib = cdll.LoadLibrary('./mylib.so') print("2 sayi gir") a,b=int(input()),int(input()) result=lib.product(a,b) print("carpim ",result) |
Çıktımız ise aşağıdaki gibi olacaktır.
1 2 3 4 |
2 sayi gir 1 2 carpim 2 |
2.YÖNTEM(SETUPTOOLS KULLANMAK)
İlk olarak bu yapıdan bahsedelim,setuptools python geliştiricileri için oluşturulmuş paket oluşturma aracıdır.Hemen aşağıdaki komutu yazarak yüklememizi yapalım.
1 |
pip install setuptools |
Şimdi ise kodlarımızı yazacağımız demo.c dosyasını oluşturup aşağıdaki kodları yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <stdio.h> #include <Python.h> #include <time.h> //burada basit bir toplama işlemi yazalım. int addition (int a, int b) { return a+b; } //Yukarıda yazdığımız fonksiyon için python objesi oluşturacak olan başka bir fonksiyon içerisinde çağıralım. //not:toplama işlemini bu fonksiyon içerisindede yazabilirsiniz static PyObject* DemoLib_addition(PyObject *self, PyObject *args) { int a; int b; if (!PyArg_ParseTuple(args, "ii", &a, &b)) { return NULL; } return Py_BuildValue("i", addition(a,b)); } // modülün fonksiyon tablosu static PyMethodDef demoMethods[] ={ {"DemoLib_addition", DemoLib_addition, METH_VARARGS, "sum of two number"}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef demomodule = { PyModuleDef_HEAD_INIT, "demo", NULL, -1, demoMethods }; PyMODINIT_FUNC PyInit_demo() { PyObject* pModule = PyModule_Create(&demomodule); return pModule ; } |
Ardında setup.py dosyasımızı oluşturarak demo.c ‘yi extension olarak kaydedelim.
1 2 3 4 5 6 7 8 9 10 |
from setuptools import Extension, setup module = Extension("demo", sources=[ 'demo.c' ]) setup(name='demo', version='1.0', description='example demo package', ext_modules=[module]) |
Build edelim.
1 |
sudo python setup.py build |
Gönül rahatlılığı ile ile uygulamamızın içinde import edelim.Eğer yazdığımız kütüphaneyi default şekilde eklemek istersek install etmemiz gerekir.
1 |
sudo python setup.py install |
Build ettiğimiz eklentiyi örnek uygulamamızı hazırladıktan sonra yazımızı bitirelim.
1 2 3 4 5 6 7 8 |
import sys sys.path.insert(0, './build/lib.linux-x86_64-3.6/') # specify the directory containing the extension module here import demo a,b=int(input()),int(input()) result= demo.DemoLib_addition(a,b) print("toplam ",result) |
Bütün yazıyı toparlarsak ,amacımız daha düşük seviyeli diller ile hesaplama yapıp (c/c++ gibi ) ,pythonda(projede python kullanıyoruz) .Bu hesabı kullanmak bazı işlemleri pythonda yapmamızın sebebi pythonun sanıldığının aksine çok hızlı hesap yapamıyor oluşudur.Pythona ait birçok kütüphane hali hazırda c++ için yazılım lapack vb kütüphaneleri kullanmaktadır.
1.Yöntem : c /c++ ile hesaplamaları yaparak shared library olarak paylaşıyoruz.(benim tercihim)
2.Yöntem: cpython kullanarak,<python.h> kullanarak python object oluşturacak fonksiyonlar oluşturuyoruz.
Bu bağlantılardan kaynak kodlara ulaşabilirsiniz.:https://github.com/SirmaXX/extension_python_examples
KAYNAKÇA
- https://physicspython.wordpress.com/2020/11/11/using-c-functions-in-python/
- https://github.com/ilkermanap/rnglfg
- https://www.geeksforgeeks.org/how-to-call-c-c-from-python/
- https://stackabuse.com/enhancing-python-with-custom-c-extensions/
- https://www.youtube.com/watch?v=Qgevy75co8c
Eline sağlık. Çok berrak bir anlatım olmuş.