0Pricing
Python Academy · درس

لماذا امتدادات C؟ حالات الاستخدام والمفاضلات

افهم متى ولماذا تمدّد Python باستخدام شيفرة C الأصلية

لماذا امتدادات C؟ حالات الاستخدام والمفاضلات درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

ما هو امتداد C؟

امتداد C هو مكتبة مشتركة مترجمة (.so على Linux وmacOS، و.pyd على Windows) يمكن لـ Python استيرادها. وهي تعرض دوال وأنواعًا مطبقة بلغة C.

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

متى تستخدم امتدادات C

استخدم امتدادات C في الحلقات العددية المرتبطة بالمعالج، أو لتغليف مكتبات C الموجودة، أو لتجاوز GIL في أحمال العمل متعددة الخيوط، أو لتحقيق كفاءة عالية جدًا في استخدام الذاكرة.

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

بدائل امتدادات C

قبل كتابة C، جرّب Cython (Python مع تعليقات الأنواع ← C)، أو Numba (ترجمة JIT)، أو cffi/ctypes (لاستدعاء مكتبات C الموجودة). امتدادات C الكاملة هي الخيار الأقوى، لكنها الأكثر تعقيدًا.

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

اعتبار GIL

يسمح قفل المفسر العام (GIL) لخيط واحد فقط بتنفيذ بايت كود Python في كل مرة. ويمكن لامتدادات C تحرير GIL أثناء تنفيذ عمل C الخالص، مما يتيح التوازي الحقيقي عبر عدة خيوط.

# 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

المفاضلات

امتدادات C أسرع، لكنها أصعب في الكتابة وتصحيح الأخطاء والصيانة. وهي تتطلب معرفة بلغة C، وبنية تحتية للبناء، واختبارات خاصة بكل منصة.

# 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

نظرة عامة على Python/C API

توفر Python/C API وحدات ماكرو ودوالًا لإنشاء كائنات Python، ومعالجة أعداد المراجع، وتحليل الوسائط، ورفع الاستثناءات، واستدعاء Python من 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

استخدم ملف setup.py مع كائنات Extension لتجميع امتداد C وتثبيته.

# setup.py
from setuptools import setup, Extension

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

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

أمثلة من العالم الحقيقي

يعتمد نظام Python البيئي بدرجة كبيرة على امتدادات C؛ إذ تستخدمها NumPy وPillow وlxml وPyYAML، بالإضافة إلى وحدات المكتبة القياسية json وhashlib وzlib.

# 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: المسار الأسهل

يُجمّع Cython كود Python المزوّد بالتعليقات التوضيحية إلى امتدادات C. ابدأ باستخدام Cython قبل كتابة C الخام — فهو أسهل بكثير، وغالبًا ما يحقق 90% من السرعة.

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

تصحيح أخطاء امتدادات C

استخدم gdb أو lldb لتصحيح أعطال امتدادات C. فعّل -g في CFLAGS، وقم بالتجميع دون تحسينات للحصول على تتبعات مكدس واضحة.

# 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

اختبار امتدادات C

اختبر امتدادات C عبر واجهة Python الخاصة بها باستخدام pytest — ولا حاجة إلى إطار اختبار خاص بلغة C.

# 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")

تحقق سريع

ما السبب الرئيسي لكتابة امتداد C بدلًا من استخدام Python الخالصة؟

مراجعة

امتدادات C هي أسرع طريقة لتسريع Python: فهي تنفّذ كود C الأصلي ويمكنها تحرير GIL. استخدم ctypes/cffi لاستدعاء مكتبات C الموجودة، وCython لتجميع Python المزوّد بالتعليقات التوضيحية إلى C، وامتدادات C الخام فقط عندما تحتاج إلى أقصى قدر من التحكم. احرص دائمًا على الاختبار عبر واجهة Python.

الأسئلة الشائعة

هل درس «لماذا امتدادات C؟ حالات الاستخدام والمفاضلات» مجاني؟

نعم — نص درس «لماذا امتدادات C؟ حالات الاستخدام والمفاضلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «لماذا امتدادات C؟ حالات الاستخدام والمفاضلات»؟

افهم متى ولماذا تمدّد Python باستخدام شيفرة C الأصلية تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «لماذا امتدادات C؟ حالات الاستخدام والمفاضلات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لماذا امتدادات C؟ حالات الاستخدام والمفاضلات
  2. ctypes: استدعاء مكتبات C من Python
  3. cffi: واجهة الدوال الأجنبية لـ C
  4. كتابة وحدة امتداد C لـ Python
← العودة إلى Python Academy