- Pythonschleifen sind im Vergleich zu low-level Sprachen wie C/C++/Fortran sehr langsam.
- C-Typen sind deutlich schneller, haben allerdings auch C-Semantik (z.B. Overflow bei ganzzahligen Datentypen).
- Pythonfunktionen haben einen großen Overhead.
- Sobald eine Funktion aufgerufen wurde, besteht für den Code innerhalb der Funktion kein Performanceunterschied zwischen
def
,cdef
undcpdef
. - Verwende Fused Types für generischen Cythoncode
- Verwende die standardisierten ganzzahligen Typen aus
libc.stdint
. - Kompilieren mit Profilingflags verlangsam den Code. Daher niemals für den Releasecode verwenden.
- Verwende Typed Memoryviews für effizienten Zugriff auf
np.array
s. - Schleifen über
np.array
s innerhalb von Python möglichst vermeiden. - Verwende für Typed Memoryviews auf
np.array
s den richtigendtype
. - Die Daten in einem
np.array
sind standardmäßig zeilenweise (row-major) gespeichert. - Bei der Deklaration eines Memoryviews das Memorylayout möglichst angeben und den Speicher in der angelegten Reihenfolge durchgehen (Cache-friendly Code).
- Deklariere Cythonfunktionen, welche keine Pythonobjekte oder -operationen verwenden, mit
nogil
. - Für parallelen Cythoncode muss der Global Interpreter Lock deaktiviert werden.
- Verwende für
prange
geeignetesschedule
undchunksize
, um die Arbeit optimal unter den Threads aufzuteilen.
- Falls möglich, den C-Speicher für Arrays mit Hilfe von
np.array
s in Python allokieren und durch ein Typed Memoryview an die C-Funktion übergeben. - Verwende
cython.view.arrays
für die automatische Verwaltung von C-Speicher, der kompatibel zu einem Memoryview ist. - Nutze das RAII-Prinzip für automatische Speicherverwaltung innerhalb Pythons.
- Stelle sicher, dass die
setup.py
deines Cythonpackages mit verschiedenen Compilern funktioniert. - Read the docs!