تقنية

heapq.merge في بايثون: هل يستدعي key لكل عنصر؟

One stream [2,5,9]; key calls: [2].
سجل المسار الواحد.

في CPython 3.12.14، merge قد تمرر بقية مسار وحيد دون استدعاء key لكل قيمة؛ ليست خطوة تحقق لكل عنصر. [1] [2]

الخلاصة السريعة

لا؛ عدد النداءات قد يقل عن العناصر. [1] [2]

  • في CPython 3.12.14، merge قد تمرر بقية مسار وحيد دون استدعاء key لكل قيمة؛ ليست خطوة تحقق لكل عنصر. [1] [2]
  • مدخلنا المرتب [2,5,9]؛ key تسجل القيمة ثم تعيدها للمقارنة. [1] [2]
  • list(merge([2,5,9],key=key)) تعطي [2,5,9]؛ calls=[2] فقط. [1] [2]
  • تحكم بمسارين [2,5,9] و[4]: الناتج [2,4,5,9]، وسجل المفتاح [2,4,5]؛ 9 خرجت دون نداء. [1] [2]
  • الكود يمرر البقية عند بقاء مكرر واحد. نحصر الأعداد والسجلات في تجربتنا؛ لا نعمم عدد النداءات على مدخلات أخرى. [1] [2]

المفتاح ليس تحققًا

في CPython 3.12.14، merge قد تمرر بقية مسار وحيد دون استدعاء key لكل قيمة؛ ليست خطوة تحقق لكل عنصر. [1] [2]

مدخل مرتب

مدخلنا المرتب [2,5,9]؛ key تسجل القيمة ثم تعيدها للمقارنة. [1] [2]

مسار واحد

list(merge([2,5,9],key=key)) تعطي [2,5,9]؛ calls=[2] فقط. [1] [2]

from heapq import merge calls=[] def key(value):calls.append(value);return value print(list(merge([2,5,9],key=key)),calls) [1] [2]

Two streams [2,5,9] and [4]; key calls: [2,4,5].
سجل المسارين.

مساران والتحكم

تحكم بمسارين [2,5,9] و[4]: الناتج [2,4,5,9]، وسجل المفتاح [2,4,5]؛ 9 خرجت دون نداء. [1] [2]

control_calls=[] def control_key(value):control_calls.append(value);return value print(list(merge([2,5,9],[4],key=control_key)),control_calls) [1] [2]

الكود يمرر البقية عند بقاء مكرر واحد. نحصر الأعداد والسجلات في تجربتنا؛ لا نعمم عدد النداءات على مدخلات أخرى. [1] [2]

المراجع

  1. Python merge
  2. CPython merge

للتوسع: لغات البرمجة.

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