Geri Dön
Python'da JSON ayrıştırma fastsimdjson ve free threading ile 66 GB/sn'ye ulaşıyor
SiTech AI Team2 dk okuma

Python'da JSON ayrıştırma fastsimdjson ve free threading ile 66 GB/sn'ye ulaşıyor

7,6 GB'lık GitHub olay günlüğü Python 3.14.6, fastsimdjson 0.6.0, lazy views ve 64 iş parçacığı ile 0,12 saniyede işlendi. Kıyaslama, aralarında TypeScript, JavaScript, Python ve Java'nın da bulunduğu 65.269 pull request'i saydı.

Ne ölçüldü

Daniel Lemire, GH Archive tarafından NDJSON formatında toplanan, 13 Mart 2024'ten itibaren saatlerce süren GitHub'un herkese açık depolardaki olayları kullandı. Şifrelenmiş örnek 7,6 GB boyundaydı ve her biri ortalama yaklaşık 3,4 kB olan 2,2 milyon olay içeriyordu. Görev, olay türlerini saymak ve action değeri opened olan pull request türündeki olaylar için temel depo dilini saymaktı. Sekiz saat boyunca Lemire 65.269 açık pull request saydı. En büyük gruplar TypeScript 11.565, JavaScript 7.778, Python 7.057 ve Java 4.668 ile öne çıktı. Yaklaşık 5.857 açık pull request dil belirtilmemiş depolara aitti.

Ayrıştırıcı nasıl hızını korudu

Çalışmada, simdjson'un Python bağlaması olan fastsimdjson, Python 3.14.6 ile birlikte, sunucuda iki Intel Xeon Gold 6548N işlemci ve 64 çekirdek ile kullanıldı. free threaded Python'da GIL bulunmaz ve birden fazla iş parçacığı Python kodunu aynı anda çalıştırabilir. fastsimdjson'in map_many çağrısı satırları belirtilen iş parçacığı sayısına göre dağıtır, girdi verilerini böler. Her iş parçacığı kendi Counter çiftini saklar, onu genel listeye yalnızca ilk olayda ekler, ardından diğer iş parçacıklarıyla senkronizasyon olmadan bu çifti günceller. Ana iş parçacığı, map_many'nin döndürmesinden sonra her iş parçacığının çiftlerini birleştirir. lazy = True durumunda her callback sözlük yerine bir lazy view alır. JSON yine de ayrıştırılır, ancak Python nesneleri yalnızca kodun eriştiği alanlar için oluşturulur. Lemire, lazy yaklaşımın ilk olarak Tyler Kennedy tarafından pysimdjson bağlamasında geliştirildiğini belirtiyor.

Kıyaslama sonuçları

Veriler ölçümden önce bellekte çözüldü. Lemire, en iyi sonucu yedi çalıştırmadan, tek iş parçacıklı ayrıştırıcılar için bir çalıştırmayla, standart kütüphane için 64 iş parçacığıyla elde ettiğini açıklıyor. Tek çekirdekte, standart kütüphanenin json ayrıştırıcısı 0,18 GB/sn, orjson 0,42 GB/sn, fastsimdjson map_many 0,63 GB/sn, msgspec'in türlü yapıları 1,29 GB/sn ve fastsimdjson map_many lazy views ile 2,13 GB/sn hızında çalıştı. Standart kütüphanenin örneği işlemesi 42 saniye, fastsimdjson'un lazy views ile 3,6 saniye sürdü. 64 iş parçacığıyla tek süreçte, standart kütüphane 3,17 GB/sn, msgspec'in türlü yapıları 24,6 GB/sn, fastsimdjson map_many 29,8 GB/sn ve lazy varyant 65,7 GB/sn elde etti. Bu, 7,6 GB'lık örnek için yaklaşık 0,12 saniye, yaklaşık 66 GB/sn, yani tek çekirdekli sonuçtan 31 kat daha fazla. lazy fastsimdjson'in sonucu, 64 iş parçacığıyla msgspec'ten de daha hızlıydı. Lemire'in sonucuna göre, Python saniyede onlarca gigabayt JSON ayrıştırabilir, fastsimdjson 0.6.0 ise PyPI'de mevcut.

Kaynaklar: Lobsters

SSiTech

SiTech — AI destekli web geliştirme

Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.