Skip to content

tag-indexed unions #286

Description

@nilsbtr

Does pydantic-xml currently have tag-indexed unions? I'm trying to deserialize a svg file (~3mb) and because I have big Unions of possible children (all with different/unique tags) it gets very slow as it trys to create a snapshot of every possible child.

   Ordered by: cumulative time
   List reduced from 180 to 20 due to restriction <20>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.042    0.042  249.157  249.157 ...\.venv\Lib\site-packages\pydantic_xml\model.py:524(from_xml)
        1    0.000    0.000  249.114  249.114 ...\.venv\Lib\site-packages\pydantic_xml\model.py:497(from_xml_tree)
   7719/1    0.503    0.000  248.432  248.432 ...\.venv\Lib\site-packages\pydantic_xml\serializers\factories\model.py:188(deserialize)
   7648/1    0.084    0.000  248.404  248.404 ...\.venv\Lib\site-packages\pydantic_xml\serializers\factories\homogeneous.py:66(deserialize)
 15366/13    6.960    0.000  248.378   19.106 ...\.venv\Lib\site-packages\pydantic_xml\serializers\factories\union.py:110(deserialize)
21033320/146051  104.363    0.000  238.601    0.002 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:336(create_snapshot)
21033320/146051   19.451    0.000  237.807    0.002 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:342(<listcomp>)
146051/257    0.317    0.000  218.367    0.850 ...\.venv\Lib\site-packages\pydantic_xml\serializers\factories\model.py:418(deserialize)
 21041039  107.107    0.000  115.339    0.000 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:303(__init__)
 21041039    8.231    0.000    8.231    0.000 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:269(__init__)
   7719/1    0.073    0.000    0.682    0.682 ...\.venv\Lib\site-packages\pydantic_xml\element\native\lxml.py:19(from_native)
   7719/1    0.013    0.000    0.682    0.682 ...\.venv\Lib\site-packages\pydantic_xml\element\native\lxml.py:29(<listcomp>)
     7718    0.587    0.000    0.587    0.000 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:350(apply_snapshot)
   146051    0.180    0.000    0.492    0.000 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:411(pop_element)
     7718    0.015    0.000    0.431    0.000 ...\.venv\Lib\site-packages\pydantic\main.py:669(model_validate)
     7718    0.237    0.000    0.416    0.000 {method 'validate_python' of 'pydantic_core._pydantic_core.SchemaValidator' objects}
   241849    0.148    0.000    0.305    0.000 ...\.venv\Lib\site-packages\pydantic_xml\serializers\factories\primitive.py:127(deserialize)
   146051    0.172    0.000    0.228    0.000 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:519(strict_search)
   249567    0.133    0.000    0.172    0.000 ...\.venv\Lib\site-packages\pydantic_xml\element\element.py:397(pop_attrib)
    60504    0.070    0.000    0.142    0.000 ...\.venv\Lib\site-packages\pydantic\_internal\_model_construction.py:277(__instancecheck__)

Example element:

class SVG(Element, Color, Graphics, tag="svg"):
    model_config = ConfigDict(extra="forbid")

    elements: list[RootChildren] = element()

    x: str | None = attr(default=0)
    y: str | None = attr(default=0)
    width: str | None = attr(default=None)
    height: str | None = attr(default=None)

    clip_path: str | None = attr(name="clip-path", default=None)
    mask: str | None = attr(default=None)
    opacity: str | None = attr(default=None)
    overflow: str | None = attr(default=None)
    preserve_aspect_ratio: str | None = attr(name="preserveAspectRatio", default=None)
    version: str | None = attr(default=None)
    view_box: str | None = attr(name="viewBox", default=None)

RootChildren: TypeAlias = (
    ShapeElements
    | GradientElements
    | A
    | Animate
    | AnimateMotion
    | AnimateTransform
    | ClipPath
    | Defs
    | Desc
    | Filter
    | ForeignObject
    | G
    | Image
    | Marker
    | Mask
    | Metadata
    | Pattern
    | Set
    | Style
    | SVG
    | Switch
    | Symbol
    | Text
    | Title
    | Use
    | View
)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestquestionFurther information is requested

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions