假設我正在與一個 API 通信,對于任何有效引數,該 API 都會回傳一個很長的串列。我想為幾個引數提取此串列的第一個元素。我的代碼看起來像這樣(歡迎反饋):
import asyncio
import aiohttp
URL = 'https://api2.binance.com/api/v3/trades?symbol='
symbols = ['BTCUSDT', 'ETHBTC', 'ETHUSDT']
async def get_trades(symbols):
async with aiohttp.ClientSession() as session:
tasks = [session.get(URL symbol) for symbol in symbols]
all_trades = await asyncio.gather(*tasks)
trades = [(await x.json())[0] for x in all_trades]
return trades
await get_trades(symbols)
我的問題是:運行時get_trades,所有引數的完整串列是同時存盤在某個地方,還是每個串列都處理后立即丟棄?
換句話說,它是all_trades類似于首先完全創建然后迭代(以提取第一個元素)的串列串列,還是更像是一個抽象物件,指示編譯器在創建時做什么trades?
我問是因為,如果確實首先將回應全部存盤在一起,那么這當然會占用不必要的空間,因為我只對每個串列中的一個元素感興趣。在這種情況下,我該如何修改我的代碼來擺脫這種低效率呢?
uj5u.com熱心網友回復:
all_trades是的,在下一行中處理之前,所有回應都將存盤在, 中。為避免這種情況,您可以在從所有任務中收集不需要的內容之前將其丟棄。大概這樣:
async def get_one_trade(session, symbol):
x = await session.get(URL symbol)
return (await x.json())[0] # discard the rest
async def get_trades(symbols):
async with aiohttp.ClientSession() as session:
tasks = [get_one_trade(session, symbol) for symbol in symbols]
return await asyncio.gather(*tasks)
await get_trades(symbols)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533687.html
上一篇:使用FileReader.readAsDataURL()回傳File物件的base64
下一篇:如何在回圈中呼叫Ajax
