用于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实现?   mysql Java/GlassFish MySQLNonTransientConnectionException   java访问枚举元素的位置   Android:Java在很多类中是否效率较低   java中字节数组到短数组再返回   java AutoRotate不会在setRequestedOrientation之后更改OnConfiguration   工件部署期间发生java GlassFish4错误   java添加片段会导致崩溃   在ListView(Android)上使用OnTouchListener时java崩溃   Java接口静态变量未初始化   javafx获取Java中MediaPlayer的当前状态   java获取所有选定的JList项JFrame表单Netbeans   java重写hashcode和等于强制所有实例是相同的   java如何将此日期格式与正则表达式匹配?   Java中的异常处理是一种测试形式吗?   spring hibernate查询中的java日期   java如何维护持久的后台线程?   java以一定的比率运行方法   java添加了与GWT的集成