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倍以上

参考文档

H2
H3
H4
3 columns
2 columns
1 column
10 Comments