विषय पर बढ़ें

प्रदर्शन युक्तियाँ

अधिकांश मामलों में पाइडेंटिक आपकी समस्या नहीं बनेगी, केवल तभी इसका पालन करें यदि आप सुनिश्चित हैं कि यह आवश्यक है।

सामान्य तौर पर, model_validate_json() उपयोग न करें model_validate(json.loads(...))

पर model_validate(json.loads(...)) , JSON को पायथन में पार्स किया जाता है, फिर एक निर्देश में परिवर्तित किया जाता है, फिर इसे आंतरिक रूप से मान्य किया जाता है। दूसरी ओर, model_validate_json() पहले से ही आंतरिक रूप से सत्यापन करता है।

ऐसे कुछ मामले हैं जहां model_validate(json.loads(...)) तेज़ हो सकता है. विशेष रूप से, किसी मॉडल पर 'before' या 'wrap' सत्यापनकर्ता का उपयोग करते समय, दो चरण विधि के साथ सत्यापन तेज हो सकता है। आप इस चर्चा में इन विशेष मामलों के बारे में अधिक पढ़ सकते हैं।

pydantic-core के लिए वर्तमान में कई प्रदर्शन सुधारों पर काम चल रहा है, जैसा कि यहां चर्चा की गई है। एक बार जब ये परिवर्तन विलय हो जाते हैं, तो हमें उस बिंदु पर होना चाहिए जहां model_validate_json() हमेशा से तेज़ होता है model_validate(json.loads(...)) .

TypeAdapter एक बार इंस्टेंट किया गया

यहां विचार यह है कि आवश्यकता से अधिक सत्यापनकर्ता और क्रमांकन का निर्माण करने से बचें। हर बार जब TypeAdapter इंस्टेंट किया जाता है, तो यह एक नया सत्यापनकर्ता और क्रमांकन तैयार करेगा। यदि आप किसी फ़ंक्शन में TypeAdapter उपयोग कर रहे हैं, तो हर बार फ़ंक्शन को कॉल करने पर इसे तुरंत चालू किया जाएगा। इसके बजाय, इसे एक बार इंस्टेंटियेट करें, और इसका पुन: उपयोग करें।

\=== "❌ ख़राब"

```py
from typing import List

from pydantic import TypeAdapter


def my_func():
    adapter = TypeAdapter(List[int])
    # do something with adapter
```

\=== "✅ अच्छा"

```py
from typing import List

from pydantic import TypeAdapter

adapter = TypeAdapter(List[int])

def my_func():
    ...
    # do something with adapter
```

Sequence बनाम list या tuple - Mapping बनाम dict

Sequence उपयोग करते समय, Pydantic यह जांचने के लिए isinstance(value, Sequence) को कॉल करता है कि मान एक अनुक्रम है या नहीं। साथ ही, पाइडेंटिक विभिन्न प्रकार के अनुक्रमों, जैसे list और tuple विरुद्ध सत्यापन करने का प्रयास करेगा। यदि आप जानते हैं कि मान एक list या tuple है, तो Sequence के बजाय list या tuple उपयोग करें।

यही बात Mapping और dict पर भी लागू होती है। यदि आप जानते हैं कि मान एक dict है, तो Mapping के बजाय dict उपयोग करें।

जब आपको सत्यापन करने की आवश्यकता न हो तो सत्यापन न करें - मान को अपरिवर्तित रखने के लिए Any उपयोग करें

यदि आपको किसी मान को सत्यापित करने की आवश्यकता नहीं है, तो मान को अपरिवर्तित रखने के लिए Any उपयोग करें।

from typing import Any

from pydantic import BaseModel


class Model(BaseModel):
    a: Any


model = Model(a=1)

आदिमों के उपवर्गों के माध्यम से अतिरिक्त जानकारी से बचें

\=== "ऐसा मत करो"

```py
class CompletedStr(str):
    def __init__(self, s: str):
        self.s = s
        self.done = False
```

\=== "ऐसा करो"

```py
from pydantic import BaseModel


class CompletedModel(BaseModel):
    s: str
    done: bool = False
```

टैग यूनियन का प्रयोग करें, यूनियन का नहीं

टैग यूनियन (या भेदभावपूर्ण यूनियन) एक फ़ील्ड वाला यूनियन है जो इंगित करता है कि यह किस प्रकार का है।

from typing import Any

from typing_extensions import Literal

from pydantic import BaseModel, Field


class DivModel(BaseModel):
    el_type: Literal['div'] = 'div'
    class_name: str | None = None
    children: list[Any] | None = None


class SpanModel(BaseModel):
    el_type: Literal['span'] = 'span'
    class_name: str | None = None
    contents: str | None = None


class ButtonModel(BaseModel):
    el_type: Literal['button'] = 'button'
    class_name: str | None = None
    contents: str | None = None


class InputModel(BaseModel):
    el_type: Literal['input'] = 'input'
    class_name: str | None = None
    value: str | None = None


class Html(BaseModel):
    contents: DivModel | SpanModel | ButtonModel | InputModel = Field(
        discriminator='el_type'
    )

अधिक जानकारी के लिए भेदभावपूर्ण यूनियनें देखें।

नेस्टेड मॉडलों पर TypedDict उपयोग करें

नेस्टेड मॉडल का उपयोग करने के बजाय, डेटा की संरचना को परिभाषित करने के लिए TypedDict उपयोग करें।

??? जानकारी "प्रदर्शन तुलना" एक साधारण बेंचमार्क के साथ, TypedDict नेस्टेड मॉडल की तुलना में लगभग ~2.5 गुना तेज है:

```py
from timeit import timeit

from typing_extensions import TypedDict

from pydantic import BaseModel, TypeAdapter


class A(TypedDict):
    a: str
    b: int


class TypedModel(TypedDict):
    a: A


class B(BaseModel):
    a: str
    b: int


class Model(BaseModel):
    b: B


ta = TypeAdapter(TypedModel)
result1 = timeit(
    lambda: ta.validate_python({'a': {'a': 'a', 'b': 2}}), number=10000
)
result2 = timeit(
    lambda: Model.model_validate({'b': {'a': 'a', 'b': 2}}), number=10000
)
print(result2 / result1)
```

यदि आप वास्तव में प्रदर्शन की परवाह करते हैं तो रैप सत्यापनकर्ताओं से बचें

रैप सत्यापनकर्ता आम तौर पर अन्य सत्यापनकर्ताओं की तुलना में धीमे होते हैं। ऐसा इसलिए है क्योंकि उन्हें सत्यापन के दौरान डेटा को पायथन में भौतिक रूप से तैयार करने की आवश्यकता होती है। जटिल सत्यापन तर्क के लिए रैप सत्यापनकर्ता अविश्वसनीय रूप से उपयोगी हो सकते हैं, लेकिन यदि आप सर्वोत्तम प्रदर्शन की तलाश में हैं, तो आपको उनसे बचना चाहिए।

FailFast के साथ जल्दी असफल होना

v2.8+ से प्रारंभ करके, यदि अनुक्रम में कोई भी आइटम सत्यापन विफल हो जाता है, तो आप अनुक्रम प्रकारों को जल्दी विफल करने के लिए FailFast एनोटेशन लागू कर सकते हैं। यदि आप इस एनोटेशन का उपयोग करते हैं, तो आपको अनुक्रम में शेष आइटमों के लिए सत्यापन त्रुटियां नहीं मिलेंगी यदि कोई विफल रहता है, तो आप प्रभावी रूप से प्रदर्शन के लिए दृश्यता का व्यापार कर रहे हैं।

from typing import List

from typing_extensions import Annotated

from pydantic import FailFast, TypeAdapter, ValidationError

ta = TypeAdapter(Annotated[List[bool], FailFast()])
try:
    ta.validate_python([True, 'invalid', False, 'also invalid'])
except ValidationError as exc:
    print(exc)
    """
    1 validation error for list[bool]
    1
      Input should be a valid boolean, unable to interpret input [type=bool_parsing, input_value='invalid', input_type=str]
    """

FailFast के बारे में और पढ़ें [यहां][pydantic.types.FairFast]।


本文总阅读量