填写dict的更好方法?

2024-09-29 19:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python和binance.client包装器。我正在收集交易所的所有BTC交易对,并希望用交易对创建一个简单的dict:price。 我已经想出了一个办法,但它似乎笨重,需要一分钟左右运行。我目前是一名编程专业的学生,刚刚开始学习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

Tags: ininfoclientforgetexchangebinance交易
2条回答

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

但实际上我们也不需要这样做!您可以使用dictionary comprehension一次性创建所有内容,而不是创建两个列表,然后对它们进行迭代以填充词典。另外,检查字符串结尾的更简洁的方法是^{}

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')
    }

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

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

您可以直接使用理解来构建词典:

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

字典的构造方式不太可能对性能有很大影响,但如果有大量数据,则不迭代所有数据两次应该会产生影响

还认为,联系Web服务也可能需要一些时间,所以联系Exchange可能是最慢的部分。p>

相关问题 更多 >

    热门问题