
פרסינג JSON ב-Python מגיע ל-66 GB/s עם fastsimdjson ו-free threading
יומן אירועי GitHub בנפח 7.6 GB עבר עיבוד תוך 0.12 שנייה עם Python 3.14.6, fastsimdjson 0.6.0, lazy views ו-64 תהליכונים. מבחן הביצועים ספר 65,269 בקשות משיכה, כולל TypeScript, JavaScript, Python ו-Java.
מה נמדד
Daniel Lemire השתמש בשמונה שעות של אירועים ממאגרי GitHub הציבוריים החל מ-13 במרץ 2024, אותם אסף GH Archive בפורמט NDJSON. המדגם המפוענח היה בנפח 7.6 GB והכיל 2.2 מיליון אירועים, בממוצע כ-3.4 kB לכל אירוע. המשימה הייתה לספור את סוגי האירועים, ועבור אירועי בקשת משיכה שהפעולה שלהם הייתה opened, לספור את שפת המאגר הבסיסי. לאורך שמונה שעות ספר Lemire 65,269 בקשות משיכה פתוחות. הקבוצות הגדולות ביותר היו: TypeScript עם 11,565, JavaScript עם 7,778, Python עם 7,057 ו-Java עם 4,668. כ-5,857 בקשות משיכה פתוחות השתייכו למאגרים ללא שפה.
כיצד המפענח נותר קליל
בעבודה נעשה שימוש ב-fastsimdjson, הקישור של simdjson ל-Python, יחד עם Python 3.14.6, בשרת עם שני מעבדים מסוג Intel Xeon Gold 6548N ו-64 ליבות. ב-Python עם free threading אין GIL, ומספר תהליכונים יכולים להריץ קוד Python במקביל. קריאה ל-map_many של fastsimdjson מפזרת שורות במספר התהליכונים שצוין ומחלק את נתוני הקלט. כל תהליכון שומר זוג Counter משלו, מוסיף לרשימה המשותפת רק באירוע הראשון שלו, ולאחר מכן מעדכן זוג זה ללא סנכרון עם תהליכונים אחרים. התהליכון הראשי מאגד את זוגות כל תהליכון לאחר החזרת map_many. כאשר lazy = True, כל callback מקבל lazy view במקום מילון. JSON עדיין מפוענח, אך אובייקטים של Python נוצרים רק עבור השדות שאליהם הקוד פונה. Lemire מציין שגישת lazy פותחה לראשונה על ידי Tyler Kennedy בקישור של pysimdjson.
תוצאות מבחן הביצועים
הנתונים פוענחו לזיכרון לפני מדידת הזמן. Lemire מדווח על התוצאה הטובה ביותר מבין שבע הרצות: הרצה אחת עבור מפענחים בתהליכון אחד ועבור ספריית ברירת המחדל על 64 תהליכונים. בליבה אחת, מפענח json של ספריית ברירת המחדל פעל בקצב 0.18 GB/s, orjson בקצב 0.42 GB/s, map_many של fastsimdjson בקצב 0.63 GB/s, המבנים המטופזים של msgspec בקצב 1.29 GB/s, ו-map_many של fastsimdjson עם lazy views בקצב 2.13 GB/s. לספריית ברירת המחדל נדרשו 42 שניות למדגם, ול-fastsimdjson עם lazy views — 3.6 שניות. בתהליך אחד עם 64 תהליכונים הגיעה ספריית ברירת המחדל ל-3.17 GB/s, המבנים המטופזים של msgspec ל-24.6 GB/s, map_many של fastsimdjson ל-29.8 GB/s, והגרסה עם lazy views ל-65.7 GB/s. זה משמעותו כ-0.12 שנייה למדגם בנפח 7.6 GB, כ-66 GB/s, כלומר פי 31 מהתוצאה בליבה אחת. תוצאת fastsimdjson עם lazy views הייתה גם מהירה יותר מ-msgspec עם 64 תהליכונים. למסקנתו של Lemire, Python מסוגל לפענח JSON בקצב של עשרות GB לשנייה, ו-fastsimdjson 0.6.0 זמין ב-PyPI.
מקורות: Lobsters
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.