Python Programming

التحقق بكفاءة من المُولِّدات الفارغة في بايثون

Spread the love

تُعدّ المُولّدات (Generators) ميزةً قويةً في بايثون، حيث تُوفّر طريقةً فعّالة من حيث استخدام الذاكرة لإنتاج متواليات من القيم. ومع ذلك، فإنّ تحديد ما إذا كان المُولّد فارغًا قبل التكرار قد يكون أقل وضوحًا منه مع أنواع البيانات القابلة للتكرار الأخرى. تتناول هذه المقالة طرقًا فعّالة وناجعة للتحقق من فراغ المُولّدات.

التحقق من فراغ المُولّدات بكفاءة

الطريقة الأكثر كفاءة تستفيد من دالة next() ومعالجة الاستثناءات. تُحاول next() استرداد العنصر التالي من المُولّد. إذا كان المُولّد فارغًا، فإنه يطرح استثناء StopIteration، والذي يمكننا التقاطه لتحديد الفراغ.


def my_generator(values):
    for value in values:
        yield value

gen = my_generator([1, 2, 3])

try:
    next(gen)
    is_empty = False
except StopIteration:
    is_empty = True

print(f"Is the generator empty? {is_empty}")  # Output: False

empty_gen = my_generator([])
try:
    next(empty_gen)
    is_empty = False
except StopIteration:
    is_empty = True

print(f"Is the generator empty? {is_empty}")  # Output: True

يُعدّ هذا النهج الأمثل لأنه يحاول استرداد عنصر واحد فقط. إذا لم يكن المُولّد فارغًا، فإنه يستهلك عنصرًا واحدًا؛ خلاف ذلك، فإنه لا يستهلك أي شيء، مما يجعله فعالًا للغاية من حيث استخدام الذاكرة.

طرق أقل كفاءة (تجنبها إن أمكن)

يتضمن نهج بديل تحويل المُولّد إلى قائمة باستخدام list() والتحقق من طوله. ومع ذلك، فإن هذه الطريقة أقل كفاءة بكثير بالنسبة للمُولّدات الكبيرة لأنها تستهلك المُولّد بالكامل في الذاكرة. استخدم هذه الطريقة فقط إذا لم تكن الذاكرة مصدر قلق أساسي، واحتاجت أيضًا إلى محتويات المُولّد كقائمة.


def my_generator(values):
    for value in values:
        yield value

gen = my_generator([1,2,3])
list_gen = list(gen)
is_empty = len(list_gen) == 0
print(f"Is the generator empty? {is_empty}") # Output: True (after consuming the generator)

empty_gen = my_generator([])
list_gen = list(empty_gen)
is_empty = len(list_gen) == 0
print(f"Is the generator empty? {is_empty}") # Output: True

اختيار النهج الصحيح

في معظم السيناريوهات، يُوصى بشدة بطريقة next() مع معالجة الاستثناءات نظرًا لكفاءتها. إنها تتجنب استهلاك الذاكرة غير الضروري، ولا تتفاعل مع المُولّد إلا بشكل ضئيل. يجب فقط النظر في طريقة تحويل القائمة إذا كنت تحتاج إلى محتويات المُولّد كقائمة، ولم يكن استخدام الذاكرة عاملًا محدودًا.

تذكر دائمًا إعطاء الأولوية للحل الأكثر كفاءة من حيث استخدام الذاكرة، خاصة عند العمل مع مُولّدات كبيرة محتملة.

جدول المحتويات

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *