এগুলি ব্যবহার করা এত সহজ যে তাদের ভুলভাবে ব্যবহার করা সহজ, যেমন মাথার কাছে হাতুড়ি রাখা। Pydentic-এর ক্ষেত্রেও একই কথা সত্য, Python-এর জন্য একটি উচ্চ-পারফরম্যান্স ডেটা ভ্যালিডেশন লাইব্রেরি।
Pydantic v2 এ, মূল বৈধতা ইঞ্জিন প্রয়োগ করা হয়েছে যুদ্ধযা এটিকে পাইথন ইকোসিস্টেমের দ্রুততম ডেটা যাচাইকরণ সমাধানগুলির মধ্যে একটি করে তোলে। যাইহোক, সেই পারফরম্যান্স লাভ তখনই উপলব্ধি করা যায় যদি আপনি Pydantic এমনভাবে ব্যবহার করেন যা সত্যিই এই অত্যন্ত অপ্টিমাইজ করা কোরের সুবিধা নেয়।
এই নিবন্ধটি Pydentic দক্ষতার সাথে ব্যবহার করার উপর ফোকাস করে, বিশেষ করে যখন প্রচুর পরিমাণে ডেটা যাচাই করা হয়। আমরা চারটি সাধারণ সমস্যা হাইলাইট করি যেগুলি, যদি চেক না করা হয়, তাহলে পরিমানে আদেশের কার্যকারিতার পার্থক্য হতে পারে।
1) লাইক Annotated ক্ষেত্র যাচাইকারীদের উপর সীমাবদ্ধতা
Pydentic এর একটি মূল বৈশিষ্ট্য হল যে ডেটা বৈধতা একটি মডেল ক্লাসে ঘোষণামূলকভাবে সংজ্ঞায়িত করা হয়। যখন একটি মডেল ইনস্ট্যান্ট করা হয়, তখন পাইডেন্টিক সেই শ্রেণীতে সংজ্ঞায়িত ফিল্ডের ধরন এবং যাচাইকারী অনুসারে ইনপুট ডেটা পার্স করে এবং যাচাই করে।
নিষ্পাপ দৃষ্টিভঙ্গি: ক্ষেত্র যাচাইকারী
আমরা একটি ব্যবহার করি @field_validator তথ্য যাচাই করার জন্য, যেমন একটি কিনা তা পরীক্ষা করা id কলাম আসলে একটি পূর্ণসংখ্যা বা শূন্যের চেয়ে বড়। এই শৈলী পঠনযোগ্য এবং নমনীয় কিন্তু একটি কর্মক্ষমতা খরচ সঙ্গে আসে.
class UserFieldValidators(BaseModel):
id: int
email: EmailStr
tags: list[str]
@field_validator("id")
def _validate_id(cls, v: int) -> int:
if not isinstance(v, int):
raise TypeError("id must be an integer")
if v < 1:
raise ValueError("id must be >= 1")
return v
@field_validator("email")
def _validate_email(cls, v: str) -> str:
if not isinstance(v, str):
v = str(v)
if not _email_re.match(v):
raise ValueError("invalid email format")
return v
@field_validator("tags")
def _validate_tags(cls, v: list[str]) -> list[str]:
if not isinstance(v, list):
raise TypeError("tags must be a list")
if not (1 <= len(v) <= 10):
raise ValueError("tags length must be between 1 and 10")
for i, tag in enumerate(v):
if not isinstance(tag, str):
raise TypeError(f"tag[{i}] must be a string")
if tag == "":
raise ValueError(f"tag[{i}] must not be empty")
এর কারণ হল ফিল্ড ভ্যালিডেটরদের মৃত্যুদন্ড কার্যকর করা হয় পাইথন, প্রধান ধরনের জবরদস্তি এবং বাধা যাচাইয়ের পরে। এটি তাদের মূল বৈধতা পাইপলাইনে অভিযোজিত বা মিশ্রিত হতে বাধা দেয়।
কাস্টমাইজড পদ্ধতি: Annotated
আমরা ব্যবহার করতে পারি Annotated পাইথন থেকে typing লাইব্রেরি।
class UserAnnotated(BaseModel):
id: Annotated[int, Field(ge=1)]
email: Annotated[str, Field(pattern=RE_EMAIL_PATTERN)]
tags: Annotated[list[str], Field(min_length=1, max_length=10)]
এই সংস্করণটি ছোট, পরিষ্কার এবং স্কেলে দ্রুত সম্পাদন দেখায়।
কেন Annotated দ্রুত
Annotated (PEP 593) একটি আদর্শ পাইথন বৈশিষ্ট্য typing লাইব্রেরি। ভিতরে স্থাপন করা বাধা Annotated পাইডেন্টিকের অভ্যন্তরীণ স্কিমটি পাইডেন্টিক-কোর (মরিচা) এর ভিতরে সংকলিত এবং কার্যকর করা হয়।
এর মানে হল যে বৈধকরণের সময় ব্যবহারকারী-সংজ্ঞায়িত পাইথন বৈধতা কলের প্রয়োজন নেই। অতিরিক্তভাবে কোন মধ্যবর্তী পাইথন বস্তু বা কাস্টম নিয়ন্ত্রণ প্রবাহ চালু করা হয় না।
বিপরীতে, @field_validator কাজ সর্বদা পাইথনে চালান, ফাংশন কল ওভারহেড প্রবর্তন করুন এবং প্রায়শই নকল চেকগুলি যা মূল বৈধকরণে পরিচালনা করা যেতে পারে।
গুরুত্বপূর্ণ বিবরণ
একটি গুরুত্বপূর্ণ nuance যে Annotated কোন “মরিচা” নিজেই আছে. স্পিডআপ এমন সীমাবদ্ধতাগুলি ব্যবহার করে আসে যা পাইডান্টিক-কোর বোঝে এবং ব্যবহার করতে পারে, থেকে নয় Annotated আপনা থেকেই বিদ্যমান।
বেঞ্চমার্ক
মধ্যে পার্থক্য কোনো যাচাইকরণ নেই এবং Annotated বৈধতা এই মানদণ্ডে পার্থক্যটি নগণ্য, যেখানে পাইথন যাচাইকারীতে পার্থক্যটি মাত্রার আদেশে পরিণত হতে পারে।

Benchmark (time in seconds)
┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ Method ┃ n=100 ┃ n=1k ┃ n=10k ┃ n=50k ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━┩
│ FieldValidators│ 0.004 │ 0.020 │ 0.194 │ 0.971 │
│ No Validation │ 0.000 │ 0.001 │ 0.007 │ 0.032 │
│ Annotated │ 0.000 │ 0.001 │ 0.007 │ 0.036 │
└────────────────┴───────────┴──────────┴───────────┴───────────┘
নিখুঁত পদে আমরা যাচাইয়ের সময় প্রায় এক সেকেন্ড থেকে 36 মিলিসেকেন্ড পর্যন্ত যাই। কর্মক্ষমতা প্রায় 30 গুণ বৃদ্ধি.
সিদ্ধান্ত
ব্যবহার করুন Annotated যখনই সম্ভব। আপনি পেয়েছেন ভাল কর্মক্ষমতা এবং পরিষ্কার মডেল. কাস্টম যাচাইকারীরা শক্তিশালী, কিন্তু আপনি রানটাইম খরচে সেই নমনীয়তার জন্য অর্থ প্রদান করেন তাই রিজার্ভ করুন @field_validator যুক্তির জন্য যা সীমাবদ্ধতা হিসাবে প্রকাশ করা যায় না।
2)। JSON যাচাই করুন model_validate_json()
আমাদের কাছে JSON-স্ট্রিং আকারে ডেটা আছে। এই তথ্য যাচাই করার সবচেয়ে কার্যকর উপায় কি?
নিষ্পাপ দৃষ্টিকোণ
শুধু JSON পার্স করুন এবং অভিধানটি যাচাই করুন:
py_dict = json.loads(j)
UserAnnotated.model_validate(py_dict)
কাস্টমাইজড পদ্ধতি
pydantic ফাংশন ব্যবহার করুন:
UserAnnotated.model_validate_json(j)
কেন এটা দ্রুত?
model_validate_json()JSON পার্স করে এবং এটি একটি পাইপলাইনে যাচাই করে- এটি পেডেন্টিক ইন্টারনাল এবং একটি দ্রুত JSON পার্সার ব্যবহার করে।
- এটি বৃহৎ মধ্যবর্তী পাইথন অভিধান তৈরি ও যাচাই করার সময় এই অভিধানগুলিকে দ্বিতীয়বার অতিক্রম করতে হবে না।
সঙ্গে json.loads() আপনি দ্বিগুণ অর্থ প্রদান করেন: প্রথমে JSON-কে Python অবজেক্টে পার্স করার সময়, তারপর সেই বস্তুগুলিকে যাচাইকরণ এবং বাঁধাই করার জন্য।
model_validate_json() মেমরি বরাদ্দ এবং অপ্রয়োজনীয় ট্রাভার্সাল হ্রাস করে।
বেঞ্চমার্ক
পাইডানটিক সংস্করণটি প্রায় দ্বিগুণ দ্রুত।

Benchmark (time in seconds)
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┓
┃ Method ┃ n=100 ┃ n=1K ┃ n=10K ┃ n=50K ┃ n=250K ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━┩
│ Load json │ 0.000 │ 0.002 │ 0.016 │ 0.074 │ 0.368 │
│ model validate json │ 0.001 │ 0.001 │ 0.009 │ 0.042 │ 0.209 │
└─────────────────────┴───────┴───────┴───────┴───────┴────────┘
পরম পদের পরিবর্তন আমাদের 0.1 সেকেন্ড বাঁচায় এক চতুর্থাংশ মিলিয়ন বস্তুর বৈধতা দিতে।
সিদ্ধান্ত
যদি আপনার ইনপুট JSON হয়, Pydantic কে এক ধাপে পার্সিং এবং বৈধতা পরিচালনা করতে দিন। কর্মক্ষমতা দৃষ্টিকোণ থেকে এটি ব্যবহার করার প্রয়োজন নেই model_validate_json() তবে মধ্যবর্তী পাইথন অবজেক্ট তৈরি করা এবং আপনার কোড ছোট করা এড়াতে যাইহোক এটি করুন।
3) ব্যবহার করুন TypeAdapter বাল্ক যাচাইকরণের জন্য
আমরা একটি আছে User মডেল এবং এখন আমরা একটি যাচাই করতে চাই list এর Userএস.
নিষ্পাপ দৃষ্টিকোণ
আমরা তালিকাটি লুপ করতে পারি এবং প্রতিটি এন্ট্রি যাচাই করতে পারি বা একটি মোড়কের মডেল তৈরি করতে পারি। ধরুন batch একটি আছে list[dict]::
# 1. Per-item validation
models = [User.model_validate(item) for item in batch]
# 2. Wrapper model
# 2.1 Define a wrapper model:
class UserList(BaseModel):
users: list[User]
# 2.2 Validate with the wrapper model
models = UserList.model_validate({"users": batch}).users
কাস্টমাইজড পদ্ধতি
টাইপ অ্যাডাপ্টারগুলি বস্তুর তালিকা যাচাই করতে দ্রুত।
ta_annotated = TypeAdapter(list[UserAnnotated])
models = ta_annotated.validate_python(batch)
কেন এটা দ্রুত?
ভারী উত্তোলন জং-এ ছেড়ে দিন। TypeAdapter ব্যবহার করার জন্য অতিরিক্ত wrappers তৈরির প্রয়োজন হয় না এবং এটি ব্যবহার করে বৈধতা চলে। একক সংকলিত স্কিমা. পাইথন-থেকে-মরিচা-এবং-ব্যাক বাউন্ডারি ক্রসিং এবং কম অবজেক্ট অ্যালোকেশন ওভারহেড আছে।
র্যাপার মডেলগুলি ধীর কারণ তারা কেবল তালিকা যাচাই করার চেয়ে আরও বেশি কিছু করে:
- একটি অতিরিক্ত মডেল উদাহরণ তৈরি করে
- ক্ষেত্র সেট এবং অভ্যন্তরীণ অবস্থা ট্র্যাক করে
- কনফিগারেশন, ডিফল্ট, অতিরিক্ত পরিচালনা করে
এই অতিরিক্ত স্তরটি প্রতি কলে ছোট, তবে স্কেলে পরিমাপযোগ্য হয়ে ওঠে।
বেঞ্চমার্ক
বড় সেট ব্যবহার করার সময় আমরা দেখতে পাই যে টাইপ-অ্যাডাপ্টার উল্লেখযোগ্যভাবে দ্রুততর, বিশেষ করে র্যাপার মডেলের তুলনায়।

Benchmark (time in seconds)
┏━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┓
┃ Method ┃ n=100 ┃ n=1K ┃ n=10K ┃ n=50K ┃ n=100K ┃ n=250K ┃
┡━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━┩
│ Per-item │ 0.000 │ 0.001 │ 0.021 │ 0.091 │ 0.236 │ 0.502 │
│ Wrapper model│ 0.000 │ 0.001 │ 0.008 │ 0.108 │ 0.208 │ 0.602 │
│ TypeAdapter │ 0.000 │ 0.001 │ 0.021 │ 0.083 │ 0.152 │ 0.381 │
└──────────────┴───────┴───────┴───────┴───────┴────────┴────────┘
যাইহোক, নিখুঁত পদে, স্পীডআপ আমাদের 250k বস্তুর জন্য প্রায় 120 থেকে 220 মিলিসেকেন্ড বাঁচায়।
সিদ্ধান্ত
যখন আপনি শুধুমাত্র একটি প্রকার যাচাই করতে চান, একটি ডোমেন অবজেক্ট সংজ্ঞায়িত করবেন না, TypeAdapter দ্রুততম এবং পরিষ্কার বিকল্প। যদিও এটি সময় বাঁচানোর জন্য একেবারে প্রয়োজনীয় নয়, এটি অপ্রয়োজনীয় মডেল ইনস্ট্যান্টেশন এড়িয়ে যায় এবং পাইথন-সাইড যাচাইকরণ লুপ এড়িয়ে যায়, যা আপনার কোডকে আরও পরিষ্কার এবং আরও পাঠযোগ্য করে তোলে।
4) এড়িয়ে চলুন from_attributes যদি না আপনার প্রয়োজন হয়
সঙ্গে from_attributes আপনি আপনার মডেল ক্লাস কনফিগার করুন. যখন আপনি এটি সেট আপ করেন True আপনি Pydantic কে অভিধান কীগুলির পরিবর্তে অবজেক্ট অ্যাট্রিবিউট থেকে মান পড়তে বলুন। যদি আপনার ইনপুট একটি অভিধান ছাড়া অন্য কিছু হয়, যেমন SQLAlchemy ORM উদাহরণ, একটি ডেটাক্লাস, বা বৈশিষ্ট্য সহ কোনো সাধারণ পাইথন বস্তু।
একটি ডিফল্ট হিসাবে from_attributes হয় False. কখনও কখনও বিকাশকারীরা এই বৈশিষ্ট্যটি সেট করে True মডেলটিকে নমনীয় রাখতে:
class Product(BaseModel):
id: int
name: str
model_config = ConfigDict(from_attributes=True)
যাইহোক, আপনি যদি শুধুমাত্র আপনার মডেলে অভিধানগুলি পাস করেন, তবে এটি এড়ানো ভাল from_attributes কারণ এর জন্য পাইথন থেকে অনেক কাজ করতে হয়। ইনপুটটি ইতিমধ্যেই একটি প্লেইন ম্যাপিং-এ থাকলে ফলাফল ওভারহেড কোনো সুবিধা প্রদান করে না।
কেন from_attributes=True ধীর হয়
এই পদ্ধতি ব্যবহার করে getattr() অভিধান সন্ধানের পরিবর্তে, যা ধীর। অতিরিক্তভাবে এটি আমরা যে বস্তুটি পড়ছি তার কার্যকারিতা ট্রিগার করতে পারে যেমন বর্ণনাকারী, বৈশিষ্ট্য বা ORM অলস লোডিং।
বেঞ্চমার্ক
ব্যাচের আকার বড় হওয়ার সাথে সাথে বৈশিষ্ট্যগুলি ব্যবহার করা আরও বেশি ব্যয়বহুল হয়ে ওঠে।

Benchmark (time in seconds)
┏━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━━━┓
┃ Method ┃ n=100 ┃ n=1K ┃ n=10K ┃ n=50K ┃ n=100K ┃ n=250K ┃
┡━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━━━┩
│ with attribs │ 0.000 │ 0.001 │ 0.011 │ 0.110 │ 0.243 │ 0.593 │
│ no attribs │ 0.000 │ 0.001 │ 0.012 │ 0.103 │ 0.196 │ 0.459 │
└──────────────┴───────┴───────┴───────┴───────┴────────┴────────┘
পরম পদে 250k বস্তুর বৈধতা 0.1 সেকেন্ডের চেয়ে একটু কম সাশ্রয় করে।
সিদ্ধান্ত
শুধুমাত্র ব্যবহার করুন from_attributes যখন আপনার ইনপুট হয় কোন আদেশ নেই. এটি অ্যাট্রিবিউট-ভিত্তিক অবজেক্ট (ORM, ডেটাক্লাস, ডোমেন অবজেক্ট) সমর্থন করার জন্য বিদ্যমান। এই ক্ষেত্রে, বস্তুটিকে প্রথমে একটি নির্দেশে ডাম্প করা এবং তারপরে এটি যাচাই করা দ্রুত হতে পারে। প্লেইন ম্যাপিংয়ের জন্য, এটি কোনো সুবিধা ছাড়াই ওভারহেড যোগ করে।
উপসংহার
এই অপ্টিমাইজেশনের উদ্দেশ্য নিজের জন্য কয়েক মিলিসেকেন্ড নষ্ট করা নয়। পরম পদে, এমনকি 100 ms এর পার্থক্য একটি বাস্তব সিস্টেমে খুব কমই একটি বাধা।
আসল মান পরিষ্কার কোড লেখা এবং আপনার সরঞ্জামগুলি সঠিকভাবে ব্যবহার করার মধ্যে রয়েছে।
এই নিবন্ধে নির্দিষ্ট টিপস ব্যবহার করে পরিষ্কার মডেলআরও পরিষ্কার উদ্দেশ্যএবং ক ভাল প্রান্তিককরণ কিভাবে Pydentic কাজ করার জন্য ডিজাইন করা হয়েছে. এই প্যাটার্নগুলি বৈধতা যুক্তিকে অ্যাড-হক পাইথন কোডের বাইরে এবং ঘোষণামূলক স্কিমাতে নিয়ে যায়। পড়া সহজ, যুক্তি এবং বজায় রাখা.
কর্মক্ষমতা উন্নতি কাজ করার একটি পার্শ্ব প্রতিক্রিয়া সঠিক পথ. যখন বৈধকরণের নিয়মগুলি ঘোষণামূলকভাবে প্রকাশ করা হয়, তখন Pydentic সেগুলিকে ধারাবাহিকভাবে প্রয়োগ করতে পারে, সেগুলিকে অভ্যন্তরীণভাবে মানিয়ে নিতে পারে এবং আপনার ডেটা বৃদ্ধির সাথে সাথে সেগুলিকে স্বাভাবিকভাবে স্কেল করতে পারে৷
সংক্ষেপে:
এই নিদর্শনগুলিকে গ্রহণ করবেন না কারণ তারা দ্রুত। এগুলিকে গ্রহণ করুন কারণ তারা আপনার কোডকে সহজ, আরও স্পষ্ট এবং আপনি যে সরঞ্জামগুলি ব্যবহার করছেন তার জন্য আরও উপযুক্ত করে তোলে৷
স্পিডআপ শুধুমাত্র একটি চমৎকার বোনাস.
আমি আশা করি এই নিবন্ধটি আমি যতটা চেয়েছিলাম ততটাই পরিষ্কার ছিল, কিন্তু যদি এটি না হয় তবে দয়া করে আমাকে আরও স্পষ্ট করার জন্য আমি কী করতে পারি তা জানান। ইতিমধ্যে, আমার চেক আউট অন্যান্য নিবন্ধ সব ধরনের প্রোগ্রামিং-সম্পর্কিত বিষয়ে।
শুভ কোডিং!
– মাইক
PS: আমি কি করছি ভালো? আমাকে অনুসরণ করুন!