2017-07-28 105 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找到最大的對象:它對程序員來說更易讀。

相關問題