Python Academy · Lektion

Hvorfor C-udvidelser? Anvendelser og afvejninger

Forstå, hvornår og hvorfor Python bør udvides med native C-kode.

Lektion 1 af 413 trin

Hvorfor C-udvidelser? Anvendelser og afvejninger er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad er en C-udvidelse

En C-udvidelse er et kompileret delt bibliotek (.so på Linux/macOS, .pyd på Windows), som Python kan importere. Det eksponerer funktioner og typer, der er implementeret i C.

# After building the extension:
import myext
result = myext.fast_sum([1, 2, 3, 4, 5])
print(result)   # 15 (computed in C)

Hvornår skal du bruge C-udvidelser

Brug C-udvidelser til CPU-begrænsede numeriske løkker, til at indpakke eksisterende C-biblioteker, til at omgå GIL ved arbejdsbelastninger med flere tråde eller til at opnå ekstremt effektiv hukommelsesbrug.

# Good candidates for C extensions:
# - NumPy array operations
# - Image processing pixel loops
# - Cryptographic primitives
# - Wrapping libpng, libssl, sqlite3

Alternativer til C-udvidelser

Før du skriver C, kan du prøve Cython (Python med annoteringer → C), Numba (JIT) eller cffi/ctypes (til kald af eksisterende C-biblioteker). Fulde C-udvidelser er den mest kraftfulde, men også den mest komplekse mulighed.

# Cython example — almost Python syntax:
# def fast_sum(int[:] arr) -> int:
#     cdef int total = 0
#     for x in arr:
#         total += x
#     return total

Overvej GIL

Den globale fortolkerlås (GIL) tillader kun én tråd at udføre Python-bytecode ad gangen. C-udvidelser kan frigive GIL under rent C-arbejde, så ægte parallelitet med flere tråde bliver mulig.

# In a C extension:
# Py_BEGIN_ALLOW_THREADS
#     result = heavy_cpu_work(data);
# Py_END_ALLOW_THREADS
#
# Other Python threads run while this C code executes

Afvejninger

C-udvidelser er hurtigere, men sværere at skrive, fejlfinde og vedligeholde. De kræver viden om C, build-infrastruktur og platformspecifik testning.

# Trade-offs:
# + Fastest possible execution
# + Direct access to C libraries
# + Can release GIL
# - Complex build setup (setup.py / CMake)
# - Platform-specific compilation
# - Memory management is manual
# - Harder to debug

Oversigt over Python/C-API'et

Python/C-API'et indeholder makroer og funktioner til at oprette Python-objekter, manipulere referencetællere, fortolke argumenter, rejse undtagelser og kalde Python fra C.

// C API basics:
// PyObject*  — pointer to any Python object
// Py_INCREF  — increment reference count
// Py_DECREF  — decrement reference count
// PyArg_ParseTuple — parse Python args from C
// PyErr_SetString  — raise a Python exception from C

setup.py-build

Brug setup.py med Extension-objekter til at kompilere og installere en C-udvidelse.

# setup.py
from setuptools import setup, Extension

setup(
    name="myext",
    ext_modules=[
        Extension("myext", sources=["myext.c"])
    ]
)

# Build:
# python setup.py build_ext --inplace

Eksempler fra virkeligheden

Python-økosystemet er i høj grad afhængigt af C-udvidelser: NumPy, Pillow, lxml, PyYAML og standardbiblioteksmodulerne json, hashlib og zlib bruger dem alle.

# NumPy is a C extension:
import numpy as np
a = np.arange(1_000_000)
result = a.sum()   # executed in C, 100x faster than pure Python
print(result)

Cython: Den nemmere vej

Cython kompilerer Python-kode med annoteringer til C-udvidelser. Begynd med Cython, før du skriver rå C — det er meget nemmere og opnår ofte 90 % af hastigheden.

# fib.pyx (Cython)
cpdef long fib(int n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

# Compile:
# cythonize -i fib.pyx
# import fib; fib.fib(40)

Fejlfinding i C-udvidelser

Brug gdb eller lldb til at fejlsøge nedbrud i C-udvidelser. Aktivér -g i CFLAGS, og kompilér uden optimering for at få læsbare stakspor.

# Compile with debug symbols:
# CFLAGS="-g -O0" python setup.py build_ext --inplace

# Debug:
# gdb python
# (gdb) run script.py
# (gdb) backtrace

# Valgrind for memory leaks:
# valgrind --tool=memcheck python script.py

Test af C-udvidelser

Test C-udvidelser via deres Python-grænseflade med pytest — der kræves ingen særlig C-testramme.

# test_myext.py
import pytest
import myext

def test_fast_sum():
    assert myext.fast_sum([1, 2, 3]) == 6

def test_empty():
    assert myext.fast_sum([]) == 0

def test_type_error():
    with pytest.raises(TypeError):
        myext.fast_sum("not a list")

Hurtigt tjek

Hvad er den vigtigste grund til at skrive en C-udvidelse i stedet for kun at bruge Python?

Opsummering

C-udvidelser er den hurtigste måde at accelerere Python på: De udfører oprindelig C-kode og kan frigive GIL. Brug ctypes/cffi til at kalde eksisterende C-biblioteker, Cython til kompilering af Python med annoteringer til C og rå C-udvidelser, når du har brug for maksimal kontrol. Test altid via Python-grænsefladen.

Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
76
Lektioner
320

Ofte stillede spørgsmål

Er lektionen “Hvorfor C-udvidelser? Anvendelser og afvejninger” gratis?

Ja — hele teksten til “Hvorfor C-udvidelser? Anvendelser og afvejninger” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Hvorfor C-udvidelser? Anvendelser og afvejninger”?

Forstå, hvornår og hvorfor Python bør udvides med native C-kode. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Python Academy?

Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Hvorfor C-udvidelser? Anvendelser og afvejninger”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Python Academy-lektion?

Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor C-udvidelser? Anvendelser og afvejninger
  2. ctypes: Kald af C-biblioteker fra Python
  3. cffi: C Foreign Function Interface
  4. Skrivning af et Python-C-udvidelsesmodul
← Tilbage til Python Academy