
تحليل JSON في Python يصل إلى 66 GB/ث باستخدام fastsimdjson و free threading
تمت معالجة سجل أحداث GitHub بحجم 7,6 GB في 0,12 ثانية باستخدام Python 3.14.6 و fastsimdjson 0.6.0 مع lazy views و64 خيطًا. حسب المعيار المرجعي 65 269 pull request، من بينها تصدرت TypeScript وJavaScript وPython وJava.
ماذا تم قياسه
استخدم Daniel Lemire ثماني ساعات من سجل أحداث مستودعات GitHub العامة بدءًا من 13 مارس 2024، والتي جمعها GH Archive بصيغة NDJSON. كانت العينة المفكوكة 7,6 GB وتحتوي على 2,2 مليون حدث، بمتوسط حوالي 3,4 kB لكل منها. كانت المهمة هي حساب أنواع الأحداث وللأحداث من نوع pull request التي كان action فيها opened، حساب لغة المستودع الأساسي. خلال ثماني ساعات، حسب Lemire عدد 65 269 pull request مفتوحة. كانت أكبر المجموعات TypeScript بـ 11 565، وJavaScript بـ 7 778، وPython بـ 7 057، وJava بـ 4 668. حوالي 5 857 pull request مفتوحة تنتمي إلى مستودعات بدون لغة.
كيف حافظ المحلل على خفته
استخدم في العمل fastsimdjson، وهو ربط Python لـ simdjson، مع 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/ث، وorjson بـ 0,42 GB/ث، وfastsimdjson map_many بـ 0,63 GB/ث، وهياكل msgspec المُنَمْطَة بـ 1,29 GB/ث، وfastsimdjson map_many مع lazy views بـ 2,13 GB/ث. احتاجت المكتبة القياسية إلى 42 ثانية للعينة، بينما fastsimdjson مع lazy views استغرق 3,6 ثانية. في عملية واحدة باستخدام 64 خيطًا، بلغت المكتبة القياسية 3,17 GB/ث، وهياكل msgspec المُنَمْطَة 24,6 GB/ث، وfastsimdjson map_many 29,8 GB/ث، بينما بلغ الخيار lazy 65,7 GB/ث. هذا حوالي 0,12 ثانية لعينة 7,6 GB، أي حوالي 66 GB/ث، أو أكثر بـ 31 مرة من النتيجة أحادية النواة. كانت نتيجة lazy في fastsimdjson أسرع أيضًا من msgspec بـ 64 خيطًا. في ختام Lemire، يمكن لـ Python تحليل JSON بعشرات الجيجابايت في الثانية، وfastsimdjson 0.6.0 متاح على PyPI.
المصادر: Lobsters
SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي
نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.