是否有更高效的方法对此数组进行排序?

时间:2017-07-28 17:59:47

标签: python performance sorting amazon-s3 boto3

此脚本获取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')

1 个答案:

答案 0 :(得分:5)

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

  1. 如果您想获得sort;
  2. ,则无需max
  3. 您不必在排序后搜索对象。
  4. 您可以简单地使用:

    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找到最大对象:它对程序员来说更具可读性。