我有以下为我生成URLs
的方法:
async def get_url_for_ids(self, ids: List[int]) -> List[str]:
urls = []
async with self.session.create_client('s3', region_name=self.region_name) as s3:
for id in ids:
url = s3.generate_presigned_url(ClientMethod='get_object',
Params={'Bucket': self.bucket_with_videos, 'Key': '{}.mp4'.format(id)})
urls.append(url)
return urls
此方法是我应用中最慢的部分。甚至查询数据库的工作速度也快得多。如果get_url_for_ids
包含例如15 sec
元素,则ids
适用于30,000
。
如何加快速度?
答案 0 :(得分:2)
根据您对URL列表的处理方式,一个选项可能是使用generator。这意味着在您开始使用它们之前,不需要计算整个URL列表。
async def get_url_for_ids(self, ids: List[int]) -> List[str]:
async with self.session.create_client('s3', region_name=self.region_name) as s3:
for id in ids:
url = s3.generate_presigned_url(ClientMethod='get_object',
Params={'Bucket': self.bucket_with_videos, 'Key': '{}.mp4'.format(id)})
yield url
要使用此生成器,它必须位于异步函数中,并且for循环以async
为前缀:
async def main():
async for item in get_url_for_ids():
#do something
如果您需要预先计算并在内存中可用的列表,那么我不确定。
答案 1 :(得分:0)
你不会说self.bucket_with_videos的大小,但我怀疑它很大,并且API正在做一个线性的,或者可能是偶然的二次1搜索它。