-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
================================================================================
🐍 SIFIRDAN İLERİ SEVİYEYE PYTHON EĞİTİM SERİSİ - BÖLÜM 6
================================================================================
Selamlar Değerli Forum Sakinleri! 🚀🔥
Eşzamanlılık, GIL engelini aşma yöntemleri ve asenkron asyncio mimarisini
geride bıraktık. Şimdi Python'ın yüksek seviyeli sınırlarını zorlayıp doğrudan
C katmanına indiğimiz, saf performans ve sistem seviyesi entegrasyonların
konuşulduğu bölüme geçiyoruz: Bölüm 6! ☕💻
Bu bölümde:
1. Python C-API Mimarisi ve PyObject C Yapısı (Structure)
2. C/C++ ile Native Extension Yazma (Manual Binding)
3. Cython ve Pointer Seviyesinde Performans Optimizasyonu
--------------------------------------------------------------------------------
1. CPython'ın Temeli: C-API ve PyObject Anatomisi 🏛️
--------------------------------------------------------------------------------
Python'da tanımladığımız her değişken C tarafında bir PyObject yapısıdır.
CPython kaynak kodunda (Include/object.h) tanımlanan bu yapı, tüm nesnelerin
atasını oluşturur.
Bir PyObject'in C Seviyesindeki Teorik Mimarisi:
typedef struct _object {
_PyObject_HEAD_EXTRA // Çift yönlü bağlı liste pointer'ları
Py_ssize_t ob_refcnt; // Reference Counting sayacı (Bölüm 2'de işledik!)
struct _typeobject *ob_type; // Nesnenin türünü belirten pointer
} PyObject;
Örneğin, bir PyLongObject (Python int nesnesi) arka planda sadece bir tamsayı
değil, bu header ve sayı değerini tutan bir C yapısıdır. Python'ın dinamik
tür (dynamic typing) özelliğini sağlayan temel mekanizma ob_type pointer'ıdır.
--------------------------------------------------------------------------------
2. C/C++ ile Native Python Extension Yazmak ⚡
--------------------------------------------------------------------------------
Python'ın en büyük güçlerinden biri, C/C++ dilinde yazılmış kütüphaneleri
doğrudan çağırabilmesidir (ctypes veya C-API ile).
Aşağıda saf C dili ile yazılmış ve CPython C-API kullanan bir fonksiyonun
teorik yapısını inceleyelim:
#define PY_SSIZE_T_CLEAN
#include <Python.h>
// Python'dan çağrılacak C fonksiyonu
static PyObject* c_topla(PyObject* self, PyObject* args) {
long a, b;
// Python argümanlarını C tiplerine (long) parse etme
if (!PyArg_ParseTuple(args, "ll", &a, &b)) {
return NULL; // Hata durumunda Exception fırlatır
}
long sonuc = a + b;
// C tipindeki sonucu tekrar PyObject (PyLong) olarak paketleyip döndürme
return PyLong_FromLong(sonuc);
}
// Modül Metod Tablosu
static PyMethodDef ModulMetodlari[] = {
{"c_topla", c_topla, METH_VARARGS, "C seviyesinde iki sayıyı toplar."},
{NULL, NULL, 0, NULL}
};
// Modül Tanımlama Yapısı
static struct PyModuleDef cmodul = {
PyModuleDef_HEAD_INIT, "cmodul", NULL, -1, ModulMetodlari
};
// Modül Başlatma Fonksiyonu (PyInit_<modul_adi>)
PyMODINIT_FUNC PyInit_cmodul(void) {
return PyModule_Create(&cmodul);
}
Bu .c dosyası C derleyicisi (GCC/MSVC) ile derlendiğinde bir .so (Linux)
veya .pyd (Windows) dynamic library üretir ve Python'da 'import cmodul'
diyerek C hızında çalıştırılabilir!
--------------------------------------------------------------------------------
3. Cython ile Pointer Seviyesinde Hızlandırma 🛸
--------------------------------------------------------------------------------
Saf C-API yazmak zahmetlidir. Cython, Python sözdizimini (syntax) C tipleriyle
zenginleştirerek doğrudan C koduna dönüştüren ve 100 kata varan performans
artışı sağlayan bir derleyicidir.
Kıyaslama: Saf Python vs Cython (Teorik Kod)
A) Saf Python Yöntemi:
def fibonacci_py(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
B) Cython Yöntemi (.pyx uzantılı dosya):
# cdef anahtar kelimesi ile C tipleri (cint, clong) atanır.
# Bu sayede CPython nesne oluşturma ve dinamik tip kontrolü yükünden kurtulur!
def fibonacci_cy(int n):
cdef int i
cdef double a = 0
cdef double b = 1
for i in range(n):
a, b = b, a + b
return a
Cython Kodu Derlendiğinde Ne Olur?
1. .pyx dosyası Cython derleyicisi tarafından optimize edilmiş bir .c dosyasına dönüştürülür.
2. .c dosyası sistemdeki C derleyicisiyle derlenerek bir C-Extension (.pyd/.so) haline gelir.
3. Python döngüleri C işlemci komutlarına çevrildiği için C hızı elde edilir!
--------------------------------------------------------------------------------
4. Bölüm Özeti ve Gelecek Adım 📌
--------------------------------------------------------------------------------
Bu bölümde Python'ın C-API katmanını, PyObject yapısının iç mimarisini ve
Cython/C-Extension ile performans darboğazlarını nasıl aşabileceğimizi gördük.
Devam etmek için forum başlığı altına "DEVAM" yazmanız yeterlidir!
Bir sonraki bölümde (Bölüm 7 - FİNAL):
- Python İç Güvenlik ve Binary İncelemesi (.pyc Bytecode Yapısı)
- marshal ve pickle Modüllerinin Zafiyetleri / RCE Riskleri
- Python Kod Koruma (Obfuscation), PyArmor Mimarisi ve Bytecode Manipulation
Sorularınızı
ve teorik katkılarınızı aşağıda bekliyorum! 🚀✨
================================================================================
🐍 SIFIRDAN İLERİ SEVİYEYE PYTHON EĞİTİM SERİSİ - BÖLÜM 6
================================================================================
Selamlar Değerli Forum Sakinleri! 🚀🔥
Eşzamanlılık, GIL engelini aşma yöntemleri ve asenkron asyncio mimarisini
geride bıraktık. Şimdi Python'ın yüksek seviyeli sınırlarını zorlayıp doğrudan
C katmanına indiğimiz, saf performans ve sistem seviyesi entegrasyonların
konuşulduğu bölüme geçiyoruz: Bölüm 6! ☕💻
Bu bölümde:
1. Python C-API Mimarisi ve PyObject C Yapısı (Structure)
2. C/C++ ile Native Extension Yazma (Manual Binding)
3. Cython ve Pointer Seviyesinde Performans Optimizasyonu
--------------------------------------------------------------------------------
1. CPython'ın Temeli: C-API ve PyObject Anatomisi 🏛️
--------------------------------------------------------------------------------
Python'da tanımladığımız her değişken C tarafında bir PyObject yapısıdır.
CPython kaynak kodunda (Include/object.h) tanımlanan bu yapı, tüm nesnelerin
atasını oluşturur.
Bir PyObject'in C Seviyesindeki Teorik Mimarisi:
typedef struct _object {
_PyObject_HEAD_EXTRA // Çift yönlü bağlı liste pointer'ları
Py_ssize_t ob_refcnt; // Reference Counting sayacı (Bölüm 2'de işledik!)
struct _typeobject *ob_type; // Nesnenin türünü belirten pointer
} PyObject;
Örneğin, bir PyLongObject (Python int nesnesi) arka planda sadece bir tamsayı
değil, bu header ve sayı değerini tutan bir C yapısıdır. Python'ın dinamik
tür (dynamic typing) özelliğini sağlayan temel mekanizma ob_type pointer'ıdır.
--------------------------------------------------------------------------------
2. C/C++ ile Native Python Extension Yazmak ⚡
--------------------------------------------------------------------------------
Python'ın en büyük güçlerinden biri, C/C++ dilinde yazılmış kütüphaneleri
doğrudan çağırabilmesidir (ctypes veya C-API ile).
Aşağıda saf C dili ile yazılmış ve CPython C-API kullanan bir fonksiyonun
teorik yapısını inceleyelim:
#define PY_SSIZE_T_CLEAN
#include <Python.h>
// Python'dan çağrılacak C fonksiyonu
static PyObject* c_topla(PyObject* self, PyObject* args) {
long a, b;
// Python argümanlarını C tiplerine (long) parse etme
if (!PyArg_ParseTuple(args, "ll", &a, &b)) {
return NULL; // Hata durumunda Exception fırlatır
}
long sonuc = a + b;
// C tipindeki sonucu tekrar PyObject (PyLong) olarak paketleyip döndürme
return PyLong_FromLong(sonuc);
}
// Modül Metod Tablosu
static PyMethodDef ModulMetodlari[] = {
{"c_topla", c_topla, METH_VARARGS, "C seviyesinde iki sayıyı toplar."},
{NULL, NULL, 0, NULL}
};
// Modül Tanımlama Yapısı
static struct PyModuleDef cmodul = {
PyModuleDef_HEAD_INIT, "cmodul", NULL, -1, ModulMetodlari
};
// Modül Başlatma Fonksiyonu (PyInit_<modul_adi>)
PyMODINIT_FUNC PyInit_cmodul(void) {
return PyModule_Create(&cmodul);
}
Bu .c dosyası C derleyicisi (GCC/MSVC) ile derlendiğinde bir .so (Linux)
veya .pyd (Windows) dynamic library üretir ve Python'da 'import cmodul'
diyerek C hızında çalıştırılabilir!
--------------------------------------------------------------------------------
3. Cython ile Pointer Seviyesinde Hızlandırma 🛸
--------------------------------------------------------------------------------
Saf C-API yazmak zahmetlidir. Cython, Python sözdizimini (syntax) C tipleriyle
zenginleştirerek doğrudan C koduna dönüştüren ve 100 kata varan performans
artışı sağlayan bir derleyicidir.
Kıyaslama: Saf Python vs Cython (Teorik Kod)
A) Saf Python Yöntemi:
def fibonacci_py(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
B) Cython Yöntemi (.pyx uzantılı dosya):
# cdef anahtar kelimesi ile C tipleri (cint, clong) atanır.
# Bu sayede CPython nesne oluşturma ve dinamik tip kontrolü yükünden kurtulur!
def fibonacci_cy(int n):
cdef int i
cdef double a = 0
cdef double b = 1
for i in range(n):
a, b = b, a + b
return a
Cython Kodu Derlendiğinde Ne Olur?
1. .pyx dosyası Cython derleyicisi tarafından optimize edilmiş bir .c dosyasına dönüştürülür.
2. .c dosyası sistemdeki C derleyicisiyle derlenerek bir C-Extension (.pyd/.so) haline gelir.
3. Python döngüleri C işlemci komutlarına çevrildiği için C hızı elde edilir!
--------------------------------------------------------------------------------
4. Bölüm Özeti ve Gelecek Adım 📌
--------------------------------------------------------------------------------
Bu bölümde Python'ın C-API katmanını, PyObject yapısının iç mimarisini ve
Cython/C-Extension ile performans darboğazlarını nasıl aşabileceğimizi gördük.
Devam etmek için forum başlığı altına "DEVAM" yazmanız yeterlidir!
Bir sonraki bölümde (Bölüm 7 - FİNAL):
- Python İç Güvenlik ve Binary İncelemesi (.pyc Bytecode Yapısı)
- marshal ve pickle Modüllerinin Zafiyetleri / RCE Riskleri
- Python Kod Koruma (Obfuscation), PyArmor Mimarisi ve Bytecode Manipulation
Sorularınızı
ve teorik katkılarınızı aşağıda bekliyorum! 🚀✨
================================================================================
🔒 Bu içeriği görmek için giriş yapın