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

jz2*_*z22 2 python sorting performance 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')
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 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')
Run Code Online (Sandbox Code Playgroud)

通过使用max我们将获得allobjects最大的元素key.在key这里,我们使用attrgetter('last_modified')它,因为元素x将被提取x.last_modified.

请注意,我们计算max(..)allobjects本身.接下来我们得到key那个对象.

对列表进行排序在O(n log n)中工作,而计算最大值在O(n)中,因此这肯定会更快.此外,我们不需要再次搜索元素这一事实也会产生影响.最后它更优雅:我们只是声明我们想要根据某些内容找到最大对象key:它对程序员来说更具可读性.