Վերադառնալ
Python-ում JSON-ի պարսինգը հասնում է 66 GB/վ-ը fastsimdjson-ով և free threading-ով
SiTech AI Team2 րոպե ընթերցում

Python-ում JSON-ի պարսինգը հասնում է 66 GB/վ-ը fastsimdjson-ով և free threading-ով

7,6 GB GitHub-ի իրադարձությունների ամենագիրը 0,12 վայրկյանում մշակվեց Python 3.14.6-ով, fastsimdjson 0.6.0-ով lazy views-ներով և 64 հոսքով: Բենչմարկը հաշվել է 65 269 pull request, որոնցից առաջինն են TypeScript, JavaScript, Python և Java-ն:

Ինչ չափեց

Daniel Lemire-ը օգտագործեց GitHub-ի հանրային պահոցների իրադարձությունների ութ ժամը, սկսած 2024 թվականի մարտի 13-ից, որոնք 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-ը, simdjson-ի Python-ի կապումը, Python 3.14.6-ի հետ միասին, սերվերում երկու Intel Xeon Gold 6548N պրոցեսորով և 64 միջուկով: free threaded Python-ում GIL գոյություն չունի և մի քանի հոսք կարող է միաժամանակ կատարել Python-ի կոդ: fastsimdjson-ի map_many կանչը բաշխում է տողերը նշված հոսքերի քանակի վրա, մուտքային տվյալները կիսում է: Յուրաքանչյուր հոսք պահում է իր սեփական 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

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։