用于python的simdjson绑定

pysimdjson的Python项目详细描述


PyPI - LicenseCircleCI branchAppVeyor branch

Pysimdjson

simdjson快速更新python绑定,看看是否沿着这条路前进 可能会在实际应用程序中产生一些解析时间改进。到目前为止, 结果是有希望的,特别是当一份文件只有一部分是 兴趣。

绑定当前在OSX、Linux和Windows上进行测试。

请参阅http://pysimdjson.tkte.ch上的最新文档。

安装

某些平台上有可用的二进制轮。在其他平台上 需要一个C++ 17的编译器。

pip install pysimdjson

二进制轮子可用于:

Platformpy3.4py3.5py3.6py3.7
OS X 10.12xxxy
Windowsxxyy
Linuxyyyy

或从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^{} time^{} time
^{}0.099167339999999990.074089268
^{}5.3053933781.6547515810000002
^{}1.37186397099999981.0438697340000003
^{}0.048402427000000970.034239397999998644
^{}1.53827468899999960.9597240750000005
^{}0.243509732999999780.13639699600000021
^{}4.5051232850000022.8965093270000004
^{}1.03259238499999740.38916503499999777
^{}1.71290347100000060.46509220500000126
^{}0.165775196999998540.04843887400000213
^{}0.69307463100000180.6175370539999996
^{}0.60696026100000110.41049074900000093
^{}0.75870057200000220.41576198399999953
^{}0.55776042100000110.4961777420000004

获取文档子集的速度要快得多。对于canada.json 使用naive方法和items()方法获取.type,平均值 大于N=100。

PythonTime
^{}5.76244878
^{}1.5984486990000004
^{}0.3949587819999998

这种方法避免为不属于的字段创建python对象。 兴趣。当你只关心文档的一小部分时,它总是 快点。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何定制springdata存储库方法名称?   html有没有办法将java应用程序或JApplet嵌入到网站中?   Jackson ObjectMapper将java从字符串序列化为JSON作为namevalue   java刷新JTable?   用Java程序分发用JavaDB制作的数据库   java Android如何启动新活动   当集合大小超过500.000时,java的处理速度会显著降低   在java的分层目录中的多个目录中查找相同的文件   java如何将ArrayList数据插入数据库   java如何修改此代码,使其时间复杂度为o(logn)或o(n),而不是o(n^2)   java面板(SimplePanel)中仅显示图像的前1/3(大约),   jakarta ee Java Bean和企业Java Bean之间的区别?   创建AWS Cloudfront自签名URL(java sdk)时出现amazon web服务错误   基于Jersey和Jackson查询参数的java动态属性过滤