უკან დაბრუნება
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-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.