@@ -9,32 +9,96 @@ def gen_str(length: int) -> str:
99 return "" .join (random .choices (string .ascii_letters , k = length ))
1010
1111
12- class Meta (BaseModel ):
12+ class MetaP (BaseModel ):
1313 liked : bool
1414 flags : List [str ]
1515
1616
17- class Reply (BaseModel ):
17+ class ReplyP (BaseModel ):
1818 user : str = Field ()
1919 content : str
20- metadata : Meta
20+ metadata : MetaP
2121
2222
23- class Comment (BaseModel ):
23+ class CommentP (BaseModel ):
2424 user : str = Field ()
2525 stars : int = Field (..., ge = 1 , le = 5 )
2626 body : Optional [str ]
27- replies : List [Reply ]
27+ replies : List [ReplyP ]
28+
29+
30+ class PlaceP (BaseModel ):
31+ name : str
32+ location : str
33+ comments : List [CommentP ]
34+ metadata : MetaP
35+
36+
37+ def gen_reply () -> ReplyP :
38+ return ReplyP (
39+ user = "@" + gen_str (5 ),
40+ content = gen_str (20 ),
41+ metadata = MetaP (
42+ liked = random .choice ([True , False ]),
43+ flags = [gen_str (3 ) for _ in range (random .randint (0 , 3 ))],
44+ ),
45+ )
46+
47+
48+ def gen_comment () -> CommentP :
49+ return CommentP (
50+ user = "@" + gen_str (5 ),
51+ stars = random .randint (1 , 5 ),
52+ body = gen_str (40 ),
53+ replies = [gen_reply () for _ in range (random .randint (1 , 3 ))],
54+ )
55+
2856
57+ def gen_place () -> PlaceP :
58+ return PlaceP (
59+ name = gen_str (10 ),
60+ location = gen_str (20 ),
61+ comments = [gen_comment () for _ in range (100 )],
62+ metadata = MetaP (liked = True , flags = ["safe" ]),
63+ )
64+
65+
66+ start = time .perf_counter ()
67+ for i in range (10 ):
68+ gen_place ()
69+ end = time .perf_counter ()
70+
71+ print (f"{ (end - start ) * 1000 } ms" )
72+
73+ from exacting import Exact , field
2974
30- class Place (BaseModel ):
75+
76+ class Meta (Exact ):
77+ liked : bool = field ()
78+ flags : list [str ] = field ()
79+
80+
81+ class Reply (Exact ):
82+ user : str = field ()
83+ content : str = field ()
84+ metadata : Meta
85+
86+
87+ class Comment (Exact ):
88+ user : str = field ()
89+ stars : int = field (minv = 1 , maxv = 5 )
90+ body : str | None
91+ replies : list [Reply ]
92+
93+
94+ class Place (Exact ):
3195 name : str
3296 location : str
33- comments : List [Comment ]
97+ comments : list [Comment ]
3498 metadata : Meta
3599
36100
37- def gen_reply () -> Reply :
101+ def gen_reply2 () :
38102 return Reply (
39103 user = "@" + gen_str (5 ),
40104 content = gen_str (20 ),
@@ -45,26 +109,27 @@ def gen_reply() -> Reply:
45109 )
46110
47111
48- def gen_comment () -> Comment :
112+ def gen_comment2 () :
49113 return Comment (
50114 user = "@" + gen_str (5 ),
51115 stars = random .randint (1 , 5 ),
52116 body = gen_str (40 ),
53- replies = [gen_reply () for _ in range (random .randint (1 , 3 ))],
117+ replies = [gen_reply2 () for _ in range (random .randint (1 , 3 ))],
54118 )
55119
56120
57- def gen_place () -> Place :
121+ def gen_place2 () :
58122 return Place (
59123 name = gen_str (10 ),
60124 location = gen_str (20 ),
61- comments = [gen_comment () for _ in range (100 )],
125+ comments = [gen_comment2 () for _ in range (100 )],
62126 metadata = Meta (liked = True , flags = ["safe" ]),
63127 )
64128
65129
66130start = time .perf_counter ()
67- place = gen_place ()
131+ for i in range (10 ):
132+ gen_place2 ()
68133end = time .perf_counter ()
69134
70135print (f"{ (end - start ) * 1000 } ms" )
0 commit comments