此脚本获取S3存储桶中每个文件的last_modified属性,然后对它们进行排序并下载最新文件。然而,它已经花了很长时间,我想知道是否有办法提高性能。
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket(name='mytestbucket')
allobjects = bucket.objects.filter()
a=[]
for obj in allobjects:
a.append(obj.last_modified)
a.sort()
b = a[-1]
for obj in allobjects:
if obj.last_modified == b:
c = obj.key
s3.Bucket('mytestbucket22').download_file(c, 'c:\latest.csv')
答案 0 :(得分:5)
是。这里有两件事可以优化:
sort
; max
您可以简单地使用:
import boto3
from operator import attrgetter
s3 = boto3.resource('s3')
bucket = s3.Bucket(name='mytestbucket')
allobjects = bucket.objects.filter()
c = max(allobjects,key=attrgetter('last_modified')).key
s3.Bucket('mytestbucket22').download_file(c, r'c:\latest.csv')
使用max
,我们将根据allobjects
获取key
中最大的元素。在key
这里,我们使用attrgetter('last_modified')
,对于元素x
,我们会使用x.last_modified
。
请注意,我们计算max(..)
本身的allobjects
。接下来我们得到该对象的key
。
对列表进行排序在 O(n log n)中工作,而计算最大值 O(n),因此这肯定会更快。此外,我们不需要再次搜索元素的事实也会产生影响。最后它更优雅:我们只是声明我们想要根据某些key
找到最大对象:它对程序员来说更具可读性。