Geri qayıt
Python-da JSON parsingi 66 GB/s sürətlə fastsimdjson və free threading ilə
SiTech AI Team2 dəq oxu

Python-da JSON parsingi 66 GB/s sürətlə fastsimdjson və free threading ilə

7,6 GB GitHub hadisə jurnalı 0,12 saniyədə Python 3.14.6, fastsimdjson 0.6.0 lazy views və 64 thread ilə işlədi. Benchmark 65 269 pull request saydı, bunlardan TypeScript, JavaScript, Python və Java önde idi.

Nə ölçülüb

Daniel Lemire GitHub-ın public repozitoriyalarının hadisələrinin altı saatını 2024-cü il 13 martdan istifadə etdi, bunları GH Archive NDJSON formatında toplayıb. Şifrələnmiş nümunə 7,6 GB idi və 2,2 million hadisə daxildir, orta hesab 3,4 kB hər biri. Vəzifə hadisə tiplerinin sayılması və pull request tipi hadisələr üçün,-action open olanların, baz repositoriyalarının dilinin sayılması idi. Altı saat ərzində Lemire 65 269 açıq pull request saydı. Ən böyük qruplar TypeScript 11 565, JavaScript 7 778, Python 7 057 və Java 4 668 idi. Yaxlaşdır 5 857 açılan pull request dilsiz repozitoriyalara aid idi.

Parser necə sadeləşdi

İşdə fastsimdjson, simdjson-un Python bağlayıcısı, Python 3.14.6 ilə birlikdə, serverdə iki Intel Xeon Gold 6548N prosessoru və 64 core ilə istifadə olundu. Free-threaded Python-da GIL yoxdur və bir neçə thread eyni vaxtda Python kodunu icra edə bilər. fastsimdjson-un map_many çağırışı sətirləri göstərilən thread sayına bölür, giriş veriləri də bölünür. Hər thread öz Counter cütünü saxlayır, bunu ümumi siyahıya yalnız ilk hadisədə əlavə edir, sonra isə bu cütü digər threadlərlə sinxronizasiya olmadan yeniləyir. Əsas thread map_many qaytardıqdan sonra hər threadin cütlərini birləşdirir. lazy = True halında hər callback lazy view alır,lugət əvəzinə. JSON hələ parse olunur, amma Python obyektləri yalnız kodun müraciət etdiyi sahələr üçün yaradılır. Lemire qeyd edir ki, lazy yanaşma ilk dəfə Tyler Kennedy pysimdjson bağlayıcısında tətbiq edib.

Benchmark nəticələri

Məlumatlar vaxt ölçümündən əvvəl yaddaşda şifrələndi. Lemire yeddi işləmədən ən yaxşı nəticəni elan edir, bir işləmə ilə single-threaded parserlər üçün və standart kitabxana üçün 64 threaddə. Bir core-da standart kitabxana json parseri 0,18 GB/s işlədi, orjson 0,42 GB/s, fastsimdjson map_many 0,63 GB/s, msgspec-in tipli strukturları 1,29 GB/s və fastsimdjson map_many lazy views ilə 2,13 GB/s. Standart kitabxanaya nümunə üçün 42 saniyə lazım idi, fastsimdjson-lazy views isə 3,6 saniyə. Tək prosesdə 64 thread istifadə edərək standart kitabxana 3,17 GB/s çatdı, msgspec-in tipli strukturları 24,6 GB/s, fastsimdjson map_many 29,8 GB/s, lazy variant isə 65,7 GB/s. Bu təxminən 0,12 saniyə 7,6 GB nümunə üçün, təxminən 66 GB/s, yəni single-thread nəticəsindən 31 dəfə çoxdur. Lazy fastsimdjson nəticəsi ayrıca msgspec 64 thread-dən də sürətli idi. Lemire-nə görə Python JSON parsingini saniyədə onluq qiqabaytda edə bilər, fastsimdjson 0.6.0 PyPI-də mövcuddur.

Mənbələr: Lobsters

SSiTech

SiTech — AI ilə gücləndirilmiş veb hazırlanması

Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.