diff --git a/src/mistralai/models/classifiertrainingparameters.py b/src/mistralai/models/classifiertrainingparameters.py index 718beea..12e6ce3 100644 --- a/src/mistralai/models/classifiertrainingparameters.py +++ b/src/mistralai/models/classifiertrainingparameters.py @@ -31,42 +31,48 @@ class ClassifierTrainingParameters(BaseModel): @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [ + # Precompute sets for faster membership testing + optional_fields = { "training_steps", "learning_rate", "weight_decay", "warmup_fraction", "epochs", "seq_len", - ] - nullable_fields = [ + } + nullable_fields = { "training_steps", "weight_decay", "warmup_fraction", "epochs", "seq_len", - ] - null_default_fields = [] + } + null_default_fields = set() # Remains a set for lookup, even if empty serialized = handler(self) m = {} - for n, f in type(self).model_fields.items(): + # Precompute intersection of fields set, used in loop below + fields_set = self.__pydantic_fields_set__ # pylint: disable=no-member + + model_fields = type(self).model_fields + + # Avoid repeated lookups and computations in loop; minimize allocations + for n, f in model_fields.items(): k = f.alias or n - val = serialized.get(k) - serialized.pop(k, None) + # Only do one lookup in `serialized` + val = serialized.pop(k, None) optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member + # is_set will be True if n is in fields_set or k in null_default_fields + is_set = n in fields_set or k in null_default_fields + # Fast-path common cases first if val is not None and val != UNSET_SENTINEL: m[k] = val elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) + k not in optional_fields or (optional_nullable and is_set) ): m[k] = val