Proč psát moduly v C/C++
- Python je interpretovaný
- Kód je pomalejší než kompilovaný kód
- 20% kódu zabírá 80% času procesoru
- Kritickou část přepíšeme do C/C++
- Máme kód (knihovnu) napsanou v C/C++
- Chceme ho použít v Pythonu
- Nechceme kód přepisovat do Pythonu
- Chceme integrovat Python do C/C++ aplikace jako skriptovací jazyk
Python/C API
- Základ pro všechna ostatní řešení (Cython, wrappery)
- Výsledný kód je pod kontrolou programátora
- Integrace Pythonu jako skriptovacího jazyka do aplikace napsané v C/C++
- Pro velké projekty pracné
Python/C API & Linux
Instalaci lze jednoduše provést pomocí:
yum install python-devel make gcc cmake
Cython
- Z modulu napsaného v Pythonu vygeneruje zdrojový kód v jazyku C a přeloží ho
- Snadné na použití
- Vygenerovaný kód není "vždy" optimální
- Výsledný modul může být až o několik řádů rychlejší
Wrappery
- Swig
- Boost:Python
- Pyrex
- Cython
- A mnohé další
Swig
- Umožňuje vytvořit modul/knihovnu pro několik programovacích jazyků
- Modul je vytvořen jednoduše na základě interface souboru
- Funguje pro jednoduché funkce
- Pro složitější případy selhává
- Nutno řešit kódem v Python/C API
- Není univerzální pro ostatní prog. jazyky
Integrování Pythonu do aplikace
CTypes
- Umožňuje volat funkce z dynamicky zaváděných knihoven (.dll, .so)
>>> import ctypes
>>> libm = ctypes.CDLL(‘libm.so’)
>>> sin = getattr(libm, ‘sin’)
>>> sin.argtypes = [ctypes.c_double]
>>> sin.restype = ctypes.c_double
>>> y = sin(1.0)
>>> print(y)
CFFI
- Umožňuje volat C kód přímo s Pythonu
>>> from cffi import FFI
>>> ffi = FFI()
>>> ffi.cdef("int printf(const char *format, ...);")
>>> C = ffi.dlopen(None) # No library
>>> arg = ffi.new("char[]", "World")
>>> C.printf("Hello %s!\n", arg)
Hello World!