解析成了瓶颈
采集任务跑起来之后,CPU 占用最高的往往不是网络,是 JSON 解析。一次网页搜索的响应带十几个模块,几千次请求就是几千次解析,标准库 json 在这种情况下会变成明显的瓶颈。
orjson 是目前 Python 里最快的 JSON 库之一,替换成本很低。
先测再换
不要看宣传,自己测:
python
import json
import time
import orjson
raw = open("response.json", "rb").read() # 一份真实的 SerpBase 响应
for name, mod in (("json", json), ("orjson", orjson)):
start = time.time()
for _ in range(500):
mod.loads(raw)
cost = (time.time() - start) * 1000
print(f"{name}: {cost:.1f}ms / 500 次")
在你的机器、你的响应上跑一遍。结论通常是 orjson 快数倍,但具体数字和响应大小、字段数量都有关,别照搬别人的跑分。
替换时注意的几件事
返回值是 bytes。 orjson.dumps() 返回 bytes,不是 str。写文件要用二进制模式:
python
with open("out.json", "wb") as f:
f.write(orjson.dumps(data))
原生支持更多类型。 datetime、dataclass、numpy 可以直接序列化,省掉手写 default= 的麻烦:
python
from dataclasses import dataclass
@dataclass
class Snapshot:
q: str
collected_at: datetime
print(orjson.dumps(Snapshot("serp api", datetime.now())))
对非法输入更严格。 标准库 json 会容忍一些不规范的输入,orjson 默认直接报错------包括 NaN、Infinity、非 UTF-8 字节。需要容忍时要显式开选项。
我做错的一版
第一次替换后,管道在某个字段上崩了。排查发现是响应里出现了 NaN------标准库 json.dumps 会原样写出去,orjson 默认拒绝,直接抛异常。
修法不是关掉严格检查,而是在写入前把异常值处理掉。更严格的解析器暴露了原本被容忍的数据问题,这其实是好事,但要有心理准备。
另外 orjson 对重复键也会报错,从不同来源拼来的 JSON 要注意。
什么时候不用换
- 一天只跑几十次请求:差异感知不到,标准库够用
- 代码里大量传递
str而不是bytes:替换时要顺带改文件读写模式
如果一天解析几千次以上响应,值得换。采集任务、对账脚本、批量导入,都是典型场景。
一次网页搜索 1 credit,新账号 500 免费 credits,足够把解析性能也一起测了。SerpBase 的字段结构见 SerpBase 文档。