【问题标题】:Better way to fill out dict?填写dict的更好方法?
【发布时间】:2021-10-13 12:13:41
【问题描述】:

我将 python 与 binance.client 包装器一起使用。我正在从交易所收集所有 BTC 交易对,并希望使用交易对创建一个简单的字典:价格。 我想出了一种方法来做到这一点,但它对我来说似乎很笨重,需要一分钟左右的时间才能运行。我目前是一名编程学生,刚刚开始使用 python 以及其他一些语言。 还有比这更好的方法吗?

def BTCPair():
    BTCPair = []
    BTCPrice = []
    BTCPairAndPrice = {}
    exchange_info = client.get_exchange_info()
    for s in exchange_info['symbols']:
        if 'BTC' in (s['symbol'])[-3:]:
            BTCPair.append(s['symbol'])
            BTCPrice.append(client.get_avg_price(symbol=s['symbol'])['price'])
    for i in range(len(BTCPair)):
        BTCPairAndPrice[BTCPair[i]] = BTCPrice[i]
    return BTCPairAndPrice

【问题讨论】:

  • dict(zip(BTCPair, BTCPrice))
  • 为什么还要创建BTCPairBTCPrice
  • 您应该首先确定代码中的真正瓶颈。构建一个 dict 很可能不会运行一分钟。

标签: python binance


【解决方案1】:

我不明白你为什么要使用两个循环;一个将数据放入列表,另一个将这些列表转换为字典 - 为什么不直接构建字典?

你可以直接使用推导式来构造你的字典:

BTCPairAndPrice = {
    s['symbol']: client.get_avg_price(symbol=s['symbol'])['price']
    for s in exchange_info['symbols']
    if 'BTC' in (s['symbol'])[-3:]
}

字典的构建方式不太可能对性能产生很大影响,但如果有很多数据,不遍历所有数据两次应该会产生影响。

还要考虑到联系网络服务也可能需要一些时间,因此联系交易所可能是最慢的部分。

【讨论】:

    【解决方案2】:

    首先,for i in range(len(BTCPair)) 是一个antipattern。相反,您可以一起迭代那些 zipped

    但我们实际上也不需要这样做!您可以使用dictionary comprehension 一次性创建所有内容,而不是创建两个列表然后遍历它们以填写您的字典。此外,检查字符串结尾的更简洁的方法是endswith()

    def btc_pair():
        symbols = client.get_exchange_info()['symbols']
        return {
            s['symbol']: client.get_avg_price(symbol=s['symbol'])['price']
            for s in symbols
            if s['symbol'].endswith('BTC')
        }
    

    这可能会运行得更快一点,但我怀疑字典创建本身是代码中真正的性能瓶颈。

    【讨论】:

    • 我没有注意到'BTC' in (s['symbol'])[-3:] 是精神上的。使用endswith 是一种更好的方法。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2022-10-23
    相关资源
    最近更新 更多