
1 ungrown 2021 年 3 月 22 日 可以借助 JSONPath 之类的东西做个封装对象 |
2 ch2 2021 年 3 月 22 日 自己写个 converter |
3 hahastudio 2021 年 3 月 22 日 |
4 knightdf 2021 年 3 月 22 日 ujson,比内置 json 快 |
5 so1n 2021 年 3 月 22 日 第一步可以用 ujson ojson 代替 第二步目前还是 pydantic 最快 |
6 mimzy OP @hahastudio #3 昨天看了 orjson,文档中 https://github.com/ijl/orjson#deserialize 提到 loads() deserializes JSON to Python objects. It deserializes to dict, list, int, float, str, bool, and None objects. 我希望能像 Pydantic 一样返回一个对象而不是内置数据结构,就感觉不太符合… |
7 abersheeran 2021 年 3 月 22 日 有一个问题,你需要进行默认值的填充和参数校验吗?如果你不需要这些。 写一个类似于这里面的 https://github.com/abersheeran/index.py/blob/master/indexpy/utils.py#L50 类就行了。基本思路是使用三个魔术方法来自定义 obj.attr 的行为。比起其他需要校验、填充默认值的玩意,快不止一个数量级,因为这里压根就没有 COPY 的损耗。 |
8 no1xsyzy 2021 年 3 月 22 日 那 type hint 就是继承之后再写咯…… |
9 Kobayashi &nbp; 2021 年 3 月 22 日 via Android 第二步要做类型校验、转换,这能一样吗? |
10 berserk 2021 年 3 月 22 日 import json json.loads(s)不行吗 |
11 qlhai 2021 年 3 月 22 日 你都已经用 Python 了,还在乎这点时间吗 |
12 Vegetable 2021 年 3 月 22 日 parse_obj_as 是要验证的,如果数据是可信的,可以跳过验证,根据官方文档的说法: construct() is generally around 30x faster than creating a model with full validation |
13 mimzy OP @abersheeran #7 参数校验其实不需要,这个场景下我获取数据,格式基本可以保证。问题在于它传给我的结构嵌套可能比较多,所以希望用自定义对象的方式访问,这样每一层我能知道对象拥有的属性和类型,而不是从字典里一层一层访用 key 访问…你这个方式我学习一下,不过看起来没办法让 IDE 给我提示… |
14 mimzy OP @Vegetable #12 是的,昨天也简单看了下 construct(),但是看文档 https://pydantic-docs.helpmanual.io/usage/models/#creating-models-without-validation 它接收的是一堆参数,这就导致我要将返回的 List[Dict[str, Any]] 这样的东西循环一次,然后将 **dict 作为参数,这么构造完已经 30s 了,当然可能我用得不对… 如果 construct() 和 parse_raw() 能结合的话,我估计效率应该会提升。 |
15 mimzy OP @berserk #10 .json() 这一步其实就做完了这件事,我想要的是一个我能确定内部结构的对象,类型于 Go 的 structs 。不过这么说的话,突然想起来好像用 TypedDict 注解一下也行… |
16 Contextualist 2021 年 3 月 22 日 不需要参数校验的话,可以试试 attrs + cattrs 。我自己在用这个方案,但是是用来反序列化配置文件的,所以没有考虑性能。另外 pydantic 我没用过,没有发言权。据 pydantic 作者自己说估计 attrs 能更快: https://github.com/samuelcolvin/pydantic/issues/1459#issuecomment-622045131 |
18 abersheeran 2021 年 3 月 22 日 @mimzy 如果你只是需要代码提示,TypedDict 永远的神……https://github.com/abersheeran/baize/blob/master/baize/typing.py#L66 |
19 mimzy OP @abersheeran #18 我之前就是觉得 TypedDict 只用来做类型注解,然后要写一堆,太浪费了,所以上了 Pydantic 。不过看来有时候返璞归真也挺好… |
20 abersheeran 2021 年 3 月 22 日 @mimzy 另外一提,如果你没有用 pydantic 提供的 Cython 编译后的版本,其实它的速度和 attrs 之流差不多甚至慢一些。有时候觉得 pydantic 、fastapi 这些家伙的宣传挺可耻的……虚假宣传 |
21 abersheeran 2021 年 3 月 22 日 @mimzy 虽然我也是 pydantic 的重度使用者。 |
22 SystemLight 2021 年 3 月 22 日 我感觉 marshmallow 这个库还挺好用的 https://github.com/marshmallow-code/marshmallow |
23 Wicked &nbp; 2021 年 3 月 22 日 via iPhone 你要多快?找个 rapid json 之类的库自己封装一下? |
24 mimzy OP @abersheeran #20 虚假宣传哈哈哈~确实,像我现在用 FastAPI 有时候觉得还挺怀念 Django 的,啥速度不速度的,再快也超不过 Starlette 天花板,现成的工具又少… |
25 abersheeran 2021 年 3 月 22 日 @mimzy fastapi 速度还没 aiohttp 快呢。它的性能全靠吹。 |
26 misaka19000 2021 年 3 月 22 日 我们用的 ujson,用了好几年了,效果挺好 |
27 wangyzj 2021 年 3 月 23 日 大到一定体积是多大? |
28 williamfzc 2021 年 3 月 23 日 一样的问题,我们的需求是 xml -> json -> pydantic object,小文件完全 ok,文件变大之后问题会越来越明显,无论是速度跟内存占用都很爆表。前面的文本处理效率还能接受 之所以要用 python 主要是一些包调起来方便,现在已经准备慢慢用 java 重写了。。 @wangyzj 20M 左右就已经慢到不能接受了~ |