bitCNY抵押率排行榜的底层实现探索 & 效率提升

in #python-bitshares6 years ago

昨天的帖子中,我们介绍了使用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倍以上

参考文档

Sort:  

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 抵押单,需要读好几分钟。。。

Coin Marketplace

STEEM 0.26
TRX 0.11
JST 0.033
BTC 64107.21
ETH 3073.84
USDT 1.00
SBD 3.88