ואז ניסיתי לשכנע את ChatGPT לכתוב קוד יעיל
נתונים שני מערכים ואנחנו רוצים למצוא את האיברים במערך אחד שלא נמצאים בשני. מה עושים? הולכים ל AI כמובן. התחלתי עם הפרומפט הזה:
write a python function that takes 2 arrays and returns the items from first array that are not in the second array (array diff)
וקיבלתי אחלה פתרון:
def array_diff(arr1, arr2):
"""
Returns items from arr1 that are not in arr2.
Preserves order and duplicates from arr1.
"""
set2 = set(arr2) # Convert to set for faster lookups (O(1))
return [item for item in arr1 if item not in set2]
כולל הערה שמסבירה שהוא ממיר את המערך ל set בשביל שיהיו לו חיפושים מהירים. ממש אפשר לדמיין שהקוד רץ ב O(1) עד שנזכרים שלהפוך מערך ל set גם לוקח זמן.
בקיצור בגלל שאני מכיר את העולם ידעתי שהקצאת set והמרה אלה רעיונות טובים במערכים גדולים אבל כשהמערך קטן יותר מהר להריץ את הלולאה הכפולה. אז המשכתי את השיחה עם הפרומפט הבא:
I think for small arrays it will be faster to just run the nested loop
וה AI כמו חבר טוב לא התווכח ויצר לי גרסה עם לולאה כפולה שעובדת ב O(n*m) כלומר איטי יותר לקלטים ארוכים אבל יכול לעבוד מהר יותר כשהקלט קטן. הוא גם דאג להרים לי על הרעיון הטוב שהיה לי. אבל לא ככה מסיימים את הפונקציה כי אנחנו רוצים לכתוב פתרון שיעבוד יעיל גם לקלטים קטנים וגם לגדולים אז ממשיכים ומבקשים לשלב:
now combine the two - if the input is small use nested loop and if it's large use the set
וכמובן AI כמו AI מצליח לקחת כל רעיון טוב ולשבור אותו, הנה הקוד שהוא יצר:
def array_diff(arr1, arr2, threshold=50):
"""
Returns items from arr1 that are not in arr2.
- Uses nested lookup for small inputs.
- Uses set-based lookup for larger inputs.
- Preserves order and duplicates from arr1.
threshold: size of arr2 below which nested lookup is used.
"""
# If arr2 is small, avoid set overhead
if len(arr2) <= threshold:
result = []
for item in arr1:
if item not in arr2:
result.append(item)
return result
# Otherwise use set for faster lookups
set_arr2 = set(arr2)
return [item for item in arr1 if item not in set_arr2]
הבעיה היא בבדיקה - הוא בוחר בפתרון לקלטים קטנים אם arr2 קטן ומתעלם מהמקרה השקול בו arr1 קטן. עכשיו אנחנו לא פה בשביל להתקטנן עם AI אלא לשים לב. המודלים האלה אלופים בליצור קוד סטנדרטי שמתאים לתבניות שלהם. הם הרבה פחות טובים בקבלת החלטות או בתשומת לב לדברים שנראים ברורים מאליהם. עד הקפיצה הבאה של המודלים אין תחליף לערנות ולחדות המחשבה של בני אדם.