2017-07-28 103 views
2

该脚本获取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

也许让它这么按字母顺序是修改顺序,如果可能的话?这样,你可以使用'.limit(1)'。 https://stackoverflow.com/a/7974123/707111 – Ryan

回答

5

是的。这里有两件事情可以优化:

  1. 你不需要sort如果你想获得max;
  2. 您不必搜索一次排序的对象。

您可以简单地使用:

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)的而计算的最大作品OIN O(n)的,所以这肯定会工作得更快。此外,我们不需要再次搜索元素的事实也会产生影响。最后它更加优雅:我们只是声明我们想要根据key找到最大的对象:它对程序员来说更易读。

相关问题