如何加速生成网址?

时间:2017-07-07 10:10:56

标签: python algorithm performance amazon-web-services

我有以下为我生成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

如何加快速度?

2 个答案:

答案 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搜索它。