Giới thiệu về orjson

Một thư viện Python JSON thay thế hỗ trợ dataclasses, datetimes và numpy

Ảnh của Mr Cup / Fabien Barral trên Unsplash

Chủ đề hôm nay là tối ưu hóa tuần tự hóa JSON và hủy tuần tự hóa trong ứng dụng Python của bạn. Nếu bạn thường sử dụng jsonmô-đun tích hợp sẵn và đang tìm cách cải thiện hiệu suất hoặc giao dịch mỗi giây cho ứng dụng của mình, bạn nên cân nhắc sử dụng orjsonmô-đun thay thế. Dựa trên tài liệu chính thức , orjsonlà

“… Một thư viện Python JSON nhanh và chính xác hỗ trợ dữ liệu, lịch ngày và số nguyên bản.”

Chúng ta hãy xem xét những ưu điểm và nhược điểm so với các thư viện Python JSON khác.

  • tuần tự hóa dataclass
  • tuần tự hóa đối tượng datetime, numpy.ndarry, UUID nguyên bản
  • tuần tự hóa thành byte thay vì chuỗi
  • tuần tự hóa chuỗi mà không thoát unicode sang ASCII
  • tuân thủ định dạng UTF-8 và JSON nghiêm ngặt
  • nhanh hơn rất nhiều cho quá trình tuần tự hóa và hủy tuần tự hóa
  • không cung cấp load()hoặc các dump()chức năng để đọc / ghi vào các đối tượng giống tệp

Thiết lập

Cài đặt cơ bản

Bạn nên tạo một môi trường ảo trước khi tiếp tục cài đặt. Bạn có thể dễ dàng cài đặt orjsonthông qua pip install. Chạy lệnh sau tại thiết bị đầu cuối của bạn:

pip install orjson

Nếu bạn đã có một orjsongói hiện có và muốn nâng cấp nó, hãy chạy lệnh sau

pip install -U orjson

Nhập khẩu

Thêm khai báo nhập sau vào đầu tệp Python của bạn.

import orjson

Hãy xem ví dụ sau đây sắp xếp và hủy tuần tự hóa chuỗi, danh sách và từ điển.

data = {
"emoji_tears": "😂",
"emoji_clock": "⏰",
"integer": 123,
"float": 10.4,
"boolean": False,
"list": ["element1", "element2"],
"dict": {"key1": "value1", "key2": "value2"},
"russian": "Привет",
"chinese": "您好",
"japanese": "こんにちは"
}
# serialize, returns byte instead of string
json_byte = orjson.dumps(data)
# de-serialize
orjson.loads(json_byte)

  • default- Một có thể gọi trả về một kiểu được hỗ trợ. Có thể được sử dụng để tuần tự hóa một lớp con hoặc các kiểu tùy ý. Bên cạnh đó, bạn có thể thực thi quy tắc để xử lý loại ngày không được hỗ trợ bằng cách nêu ra một ngoại lệ chẳng hạn như TypeError.
  • option- Để sửa đổi cách một dữ liệu được tuần tự hóa thông qua hằng số nguyên trong orjson.

Hãy xem ví dụ sau đây sẽ phát sinh lỗi nếu dữ liệu đầu vào chứa Decimalkiểu dữ liệu.

import decimal
orjson.dumps(decimal.Decimal("3.141592653"))

TypeError: Type is not JSON serializable. decimal.Decimal

import decimal
def default(obj):
    if isinstance(obj, decimal.Decimal):
        return str(obj)
    raise TypeError
orjson.dumps(decimal.Decimal("3.141592653"), default=default)

Các optiontham số xác định phương pháp serialization. Hãy xem đoạn mã sau đây có tuần tự hóa datetimeđối tượng và numpy.array.

import orjson
import datetime
import numpy as np
data = {
"datetime": datetime.datetime.now(),
"numpy": np.array([[1, 2], [3, 4]])
}
json_byte = orjson.dumps(data, option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY)
orjson.loads(json_byte)

  • OPT_APPEND_NEWLINE- Nối \nvào đầu ra.
  • OPT_INDENT_2 - Bản in đẹp với khoảng cách thụt lề hai.
  • OPT_NAIVE_UTC - Tuần tự hóa datetime.datetimecác đối tượng mà không có tzinfoUTC. Điều này không ảnh hưởng đến datetime.datetimecác đối tượng đã tzinfothiết lập.
  • OPT_NON_STR_KEYS- Nối tiếp các phím chính tả kiểu không phải chuỗi. Tùy chọn này chậm hơn đối với các phím chuỗi so với mặc định.
  • OPT_OMIT_MICROSECONDS- Không tuần tự hóa trường micro giây trên datetime.datetimevà các datetime.timetrường hợp.
  • OPT_SERIALIZE_NUMPY- Tuần tự hóa các numpy.ndarraythể hiện.
  • OPT_SORT_KEYS- Nối tiếp các phím chính tả theo thứ tự đã sắp xếp. Mặc định là sắp xếp theo thứ tự không xác định.
  • OPT_STRICT_INTEGER - Thực thi giới hạn 53 bit trên số nguyên thay vì 64 bit tiêu chuẩn.

Đối với thông tin của bạn, hãy orjsontuần tự hóa dataclassdưới dạng bản đồ, với mọi thuộc tính được tuần tự hóa theo thứ tự được đưa ra trên định nghĩa lớp. Hãy xem ví dụ sau:

import dataclasses, orjson, typing
@dataclasses.dataclass
class Person:
    id: int
    name: str
    status: bool = dataclasses.field(default=True)
@dataclasses.dataclass
class Class:
    id: int
    name: str
    students: typing.List[Person]
data = Class(1, "Class A", [Person(1, "John Doe", False), Person(2, "Mary Sue")])
json_byte = orjson.dumps(data)
orjson.loads(json_byte)

b'{"id":1,"name":"Class A","students":[{"id":1,"name":"John Doe","status":false},{"id":2,"name":"Mary Sue","status":true}]}'

Bạn có thể dễ dàng lưu nội dung byte vào một tệp thông thường thông qua write()hàm. Tuy nhiên, bạn cần đưa bvào tham số chế độ. Hãy xem đoạn mã sau.

with open("example.json", "wb") as f:
    f.write(orjson.dumps(data))

with open("example.json", "rb") as f:
    json_data = orjson.loads(f.read())

Hãy tóm tắt lại những gì chúng ta đã học được ngày hôm nay.

Chúng tôi bắt đầu với một giải thích ngắn gọn về orjsonmô-đun. Chúng tôi đã tìm hiểu những ưu điểm và nhược điểm của mô-đun này so với phần còn lại của các thư viện Python JSON.

Tiếp theo, chúng tôi chuyển sang cài đặt nó qua pip install. Ngoài ra còn có một tùy chọn để nâng cấp gói hiện có thông qua -Uđầu vào.

Hơn nữa, chúng tôi đã thử các trường hợp sử dụng tuần tự hóa và hủy tuần tự hóa khác nhau thông qua các chức năng tải và kết xuất. Đối với tuần tự hóa, orjsonđi kèm defaultvà optioncác thông số để kiểm soát quá trình.

Cuối cùng, chúng tôi đã thử nghiệm lưu dữ liệu byte vào một tệp và tải nó vào bên trong ứng dụng Python của chúng tôi.

Cảm ơn vì đã đọc phần này. Hi vọng gặp lại các bạn trong những bài viết tiếp theo!

Tài liệu tham khảo

  1. trang orjson Github

Suggested posts

Tìm kiếm thông tin về tên miền

Đoạn trích từ Small, Sharp Software Tools của Brian P. Hogan

Tìm kiếm thông tin về tên miền

Khi bạn gửi yêu cầu tới facebook.com, máy tính của bạn sẽ tra cứu tên miền để dịch tên miền đó thành địa chỉ IP để máy tính của bạn có thể thực hiện kết nối đó.

Cách chạy plugin ChatGPT miễn phí bằng Langchain

Cách chạy plugin ChatGPT miễn phí bằng Langchain

Chắc hẳn bạn đã nghe về tất cả các plugin ChatGPT mạnh mẽ mới như Trình duyệt, Trình thông dịch mã, v.v. Nhưng có một vấn đề là quyền truy cập vào các plugin bị giới hạn trong danh sách chờ và do đó nhiều người không có quyền truy cập.

Related posts

Suy nghĩ lại về truyền thông: Năm sự thật của McChesney và tương lai của truyền thông

Trong thế giới siêu kết nối ngày nay, các hệ thống truyền thông đóng một vai trò then chốt trong việc định hình dư luận và do đó, trong việc ra quyết định dân chủ. Trong phân tích sâu sắc của mình về nền kinh tế chính trị của truyền thông, học giả Robert McChesney thách thức sự hiểu biết thông thường và trình bày cái mà ông gọi là “năm sự thật” về truyền thông.

Học tập trong tuần làm việc quan trọng hơn bạn nghĩ

Học tập trong tuần làm việc quan trọng hơn bạn nghĩ

Chúng ta thường thấy mình phải vật lộn để thực hiện những gì chúng ta biết là tốt cho chúng ta. Từ việc nói với một người quan trọng khác rằng chúng ta yêu họ đến việc nhớ nói chuyện như một tên cướp biển, sẽ luôn có những người cho rằng không cần thiết phải tổ chức các sự kiện trong ngày, tuần hoặc tháng vì họ đã làm những việc đó rồi.

3 cách đã được chứng minh để cải thiện kỹ năng viết của bạn

Lợi ích của việc viết và các chiến lược giúp bạn làm điều đó

3 cách đã được chứng minh để cải thiện kỹ năng viết của bạn

Vào năm 2022, với việc phát hành GPT-3, kỹ năng viết dường như trở nên ít quan trọng hơn. Với AI, những người viết kém cũng có thể tạo ra đội ngũ nhân viên chất lượng.

Nghệ thuật có bao giờ phi chính trị?

Nghệ thuật có bao giờ phi chính trị?

Hôm qua, chúng ta đã khép lại cuộc thi Ca khúc Eurovision năm nay bằng một đêm chung kết hoành tráng, hỗn loạn, nơi ca sĩ người Thụy Điển Loreen đã mang về chiếc cúp, trở thành người phụ nữ đầu tiên giành chiến thắng hai lần và mang vương miện về cho Thụy Điển 50 năm sau khi ABBA giành chiến thắng trong cuộc thi với “Waterloo”. Họ tiếp tục trở thành một trong những nghệ sĩ lớn nhất trong thể loại nhạc pop.