2017-07-28 14 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. あなたはmaxを取得したい場合はsortする必要はありませんが。
  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を使用することにより、我々はkeyに応じて最大であるallobjectsの要素を取得します。ここではkeyとして、xの場合はx.last_modifiedを取得するattrgetter('last_modified')を使用します。

は、max(..)allobjectsと計算します。です。次に、そのオブジェクトのkeyを取得します。リストをソート

O(N) OIN最大作品を算出一方O(N Nログ)で動作し、これは間違いなくより速く動作します。さらに、要素を再度検索する必要がないという事実も影響を与えます。最後に、それはよりエレガントです:我々はいくつかのkeyに従って最大オブジェクトを見つけたいと述べるだけで、プログラマにとってはより読みやすくなります。

関連する問題