שמירת נתון לזמן מסויים ברשימה | פייתון
-
אני בד"כ עושה ככה:
import threading def addItem(_list, item, delay=600): _list.append(item) threading.Timer(delay, lambda: _list.remove(item)).start()
הרעיון הוא ליצור "משימה" אוטומטית למחוק את הערך עוד X זמן
השימוש -
l = [] addItem(l, 'my item', 5) # 5 seconds
נ.ב.
יאלצו מתכנתי הפייתון לסלוח על ההרגל המגונה שלי להשתמש בcamelCase בפייתון. אני מאמין שזה בלתי נסבל אבל אני לא יכול לשלוט בזה. התנצלותי הכנה. -
@aaron
אכן, אני לא מתכנת פייתון (הייתי בתקופה של פייתון 2.7) ואין לי מושג איך משתמשים בasyncio, השתמשתי במה שנוח לי בשביל להדגים את הקונספט.
ניסיתי לשחק כמה דקות עם asyncio בשביל ליצור משימה ברקע בלי לחסום את הת'רד הראשי, ולא הצלחתי.(הייתי מתכנת פייתון בתקופה ש-2.7 עוד היה מגניב, ו-3.0 היה משהו ניסיוני)
-
@aaron מצד מה זה לא נכון? העלויות סיבובי מעבד זניחות במקרה כזה.
אתה יכול להרחיב על cache TTL? נראה לי שאני מכיר את זה בהקשר אחר כי אני לא מבין איך זה נכנס פה.או פשוט לשמור את הזמן ביחד עם הערך.
למה זה יותר נכון? אתה תצטרך בדיקה בכל פנייה לרשימה שהערך הזה "תקף", אז אתה חייב ליצור גם פונקציה לגשת לאלמנטים במקום פשוט לגשת אליהם, לא נראה לי שזה מה ש @צבי-ש התכוון.
-
@צבי-ש הניח את החידה בלי להסביר למה בדיוק הוא צריך את זה.
cache ttl מתאים כשהצורך הוא חיסכון בזיכרון. במקרה כזה שמירת הזמן בערך לא תעזור, כי ערך שלא יפנו אליו ולא ייבדק יישאר נצחית ברשימה.
בצרכים אחרים, למשל שהערך לא תקף אחרי X זמן, אז שמירת הזמן היא מצויינת. -
כעת ביקשתי מGPT שיסביר לי את הקוד של @צבי-ש,
והבנתי שהוא סה"כ רוצה רשימה מוגבלת לחיסכון בזיכרון בלי קשר בכלל לזמן.
בעיקרון זה בדיוק הרציונל שך cache ttl בד"כ, והפרנציפ של lru-cache הוא בדיוק בשביל זה (אני מכיר את זה מנוד אבל בפייתון זה בטוח קיים פי כמה).
בכל אופן המימוש ש@צבי-ש עשה, נראה לי מפה: https://stackoverflow.com/a/17526715/1271037
שאפשר לקבל את ההתנהגות הזאת על ידי collections.deque עם הגבלת אורך בעת הבניה.