bitCNY抵押率排行榜的底层实现探索 & 效率提升
在昨天的帖子中,我们介绍了使用python-bitshares生成bitCNY抵押率排行榜,最终我们也能生成看起来还算漂亮的排行榜。但是我发现一个问题,当我尝试生成很多条目比如前50名、前100名排行榜,我们的程序要很久才能返回。
封面图源:https://pixabay.com
如果是其它程序,慢也就慢了,多等等的耐心还是有的,但是抵押率排行榜可是和我们的钱财息息相关的,延迟越久读到的数据越老旧,因此影响了我们的决策,导致不必要的损失就惨了。于是想调查一下是什么导致了缓慢,有没有改进的余地。
底层实现机制
首先我们来分析一下python-bitshares实现抵押率排行榜的底层机制。
我们在前文介绍过,我们使用python-bitshares中Asset类的get_call_orders方法
生成抵押率排行榜。get_call_orders方法
具体实现流程为:
- 使用
Asset类
初始化bitCNY的Asset类实例 - 通过读取
bitasset_data
获取喂价(settlement_price) - 通过
get_call_orders RPC API
获取抵押数据- 使用
Price类
处理爆仓价(call_price) - 使用
Amount类
处理抵押(collateral)以及债务(debt) - 使用
Account类
处理每个借款人信息(borrower)
- 使用
这个看起来似乎没什么问题,然而仔细阅读就会发现,这个实现过程做了很多无用功,比如Price类和Amount类,为了实现加减乘除等功能,做了很多判断和处理,如果我们在程序中多次使用,会大幅降低效率。
而最严重的莫过于Account类,程序中每处理一个用户都要调用一个Account类,执行一次访问网络的操作,这会耗费大量的网络资源。
改进思路
减少不必要的类的使用
除了使用python-bitshares的bitshares类以及底层RPC调用以外,不使用任何其它类,比如Asset、Price、Amount、Account
一次性读回多个账户信息
这样无论处理多少条记录,帐户名信息都在一次RPC调用内返回
需要使用的API & 要注意的地方
API信息
lookup_asset_symbols
,读取资产信息get_objects
,读取Bit Asset信息get_call_orders
,获取抵押排行榜信息get_accounts
,读回所有账户信息
要注意的地方
bitasset id的获取
settlement_price
call order 示例
改进后代码执行时间比较
读取排行榜20条记录
改进前的代码耗时在22秒以上
改进后的代码耗时在1秒以内
读取排行榜100条记录
限于篇幅,只截取部分内容
改进前的代码耗时在105秒以上
改进后的代码耗时在3秒左右
可见,我们的代码时间效率提升了30倍以上
总结
在本文中,我们探索了用于生成抵押率排行榜的Asset类get_call_orders方法
的底层实现机制,并分析了可能影响效率的几个问题。
最后,我们用python-bitshares的bitshares类以及底层RPC调用实现了一个改进版的bitCNY抵押率排行榜,通过对比执行时间,新版的排行榜效率提升了30倍以上。
Hi ~ I'm a robot of Januschoi.I just upvoted your post!
Please also help upvote my post here: https://steemit.com/cn/@januschoi/6jlsyu
Thanks so much~!!
hello my friend best regards. please visit the blog if you have time please RESTEEM my post
这是干货,感谢!
Nice post! Thanks for sharing this important post to the steemit family. Keep it up. I follow and upvote you.
这个应用程序是否还在实验中或者在系统的改进中呢...祝你好运的朋友,如果有空闲时间,请访问我的朋友博客。@oflyhigh
这个应用程序是否还在实验中或者在系统的改进中呢...祝你好运的朋友,如果有空闲时间,请访问我的朋友博客。@oflyhigh
oil lampit's a very beautiful sight I love to see it
Thanks for sharing good work happy new year
我直接用websocket 从重钱包读数据。读所有的bitcny 抵押单,需要读好几分钟。。。