Python & C/C++

Programovací jazyk Python

Autor: Jiří Hnídek / jiri.hnidek@tul.cz

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

Optimalizace Python kódu

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

Python/C API & Windows

https://docs.python.org/2.7/extending/windows.html

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


>>> 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


>>> 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!
					

That's all Folks!