用于python的simdjson绑定
pysimdjson的Python项目详细描述
Pysimdjson
为simdjson快速更新python绑定,看看是否沿着这条路前进 可能会在实际应用程序中产生一些解析时间改进。到目前为止, 结果是有希望的,特别是当一份文件只有一部分是 兴趣。
绑定当前在OSX、Linux和Windows上进行测试。
请参阅http://pysimdjson.tkte.ch上的最新文档。
安装
某些平台上有可用的二进制轮。在其他平台上 需要一个C++ 17的编译器。
pip install pysimdjson
二进制轮子可用于:
Platform | py3.4 | py3.5 | py3.6 | py3.7 |
---|---|---|---|---|
OS X 10.12 | x | x | x | y |
Windows | x | x | y | y |
Linux | y | y | y | y |
或从git生成:
git clone https://github.com/TkTech/pysimdjson.git
cd pysimdjson
python setup.py install
示例
importsimdjsonwithopen('sample.json','rb')asfin:doc=simdjson.loads(fin.read())
然而,这并没有让你获得那么多,比如说,ujson。你还是
加载整个文档并将整个文档转换为
python对象非常昂贵。您可以使用items()
来拉动
只将文档的一部分转换成python。
示例文档:
{"type":"search_results","count":2,"results":[{"username":"bob"},{"username":"tod"}],"error":{"message":"All good captain"}}
现在让我们尝试一些查询…
importsimdjsonwithopen('sample.json','rb')asfin:# Calling ParsedJson with a document is a shortcut for# calling pj.allocate_capacity(<size>) and pj.parse(<doc>). If you're# parsing many JSON documents of similar sizes, you can allocate# a large buffer just once and keep re-using it instead.pj=simdjson.ParsedJson(fin.read())pj.items('.type')#> "search_results"pj.items('.count')#> 2pj.items('.results[].username')#> ["bob", "tod"]pj.items('.error.message')#> "All good captain"
平均x2
simdjson需要avx2支持才能正常工作。检查您的操作系统/处理器是否支持它:
- 苹果操作系统x:
sysctl -a | grep machdep.cpu.leaf7_features
- Linux系统:
grep avx2 /proc/cpuinfo
低电平接口
您可以直接使用低级simdjson迭代器接口,只需注意 这个接口可以随时更改。如果你依赖它,你应该坚持 辛普森的一个特殊版本。如果您是 处理奇怪的json,例如具有重复的非唯一键的文档。
withopen('sample.json','rb')asfin:pj=simdjson.ParsedJson(fin.read())iter=simdjson.Iterator(pj)ifiter.is_object():ifiter.down():print(iter.get_string())
早期基准
比较py3.7上的内置json模块loads
与simdjson loads
。
File | ^{ | ^{ |
---|---|---|
^{ | 0.09916733999999999 | 0.074089268 |
^{ | 5.305393378 | 1.6547515810000002 |
^{ | 1.3718639709999998 | 1.0438697340000003 |
^{ | 0.04840242700000097 | 0.034239397999998644 |
^{ | 1.5382746889999996 | 0.9597240750000005 |
^{ | 0.24350973299999978 | 0.13639699600000021 |
^{ | 4.505123285000002 | 2.8965093270000004 |
^{ | 1.0325923849999974 | 0.38916503499999777 |
^{ | 1.7129034710000006 | 0.46509220500000126 |
^{ | 0.16577519699999854 | 0.04843887400000213 |
^{ | 0.6930746310000018 | 0.6175370539999996 |
^{ | 0.6069602610000011 | 0.41049074900000093 |
^{ | 0.7587005720000022 | 0.41576198399999953 |
^{ | 0.5577604210000011 | 0.4961777420000004 |
获取文档子集的速度要快得多。对于canada.json
使用naive方法和items()
方法获取.type
,平均值
大于N=100。
Python | Time |
---|---|
^{ | 5.76244878 |
^{ | 1.5984486990000004 |
^{ | 0.3949587819999998 |
这种方法避免为不属于的字段创建python对象。 兴趣。当你只关心文档的一小部分时,它总是 快点。