2017-07-28 1 views
2

Ce script récupère les attributs last_modified de chaque fichier dans un compartiment S3, puis les trie et télécharge le dernier fichier. Cependant, cela prend déjà assez longtemps et je me demandais s'il y avait un moyen d'améliorer les performances.Existe-t-il un moyen plus performant de trier ce tableau?

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

Peut-être le rendre si alphabétique est l'ordre de modification si possible? De cette façon, vous pouvez simplement utiliser '.limit (1)'. https://stackoverflow.com/a/7974123/707111 – Ryan

Répondre

5

Oui. Il y a deux choses qui peuvent être optimisés:

  1. vous ne avez pas besoin de sort si vous voulez obtenir le max;
  2. vous n'avez pas besoin de rechercher l'objet une fois trié.

Vous pouvez simplement utiliser:

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')

En utilisant max nous obtiendrons l'élément allobjects qui est le plus important selon la key. Comme key ici, nous utilisons attrgetter('last_modified') que, pour un élément x ira chercher x.last_modified.

Notez que nous calculer le max(..) sur allobjects lui-même. Ensuite, nous obtenons le key de cet objet.

Tri d'une liste fonctionne dans O (n log n) alors que le calcul des œuvres maximales OIN O (n), donc cela va certainement travailler plus vite. De plus, le fait que nous n'ayons plus besoin de rechercher l'élément aura également un impact. Enfin, il est plus élégant: nous indiquons simplement que nous voulons trouver l'objet maximum selon certains key: il est plus lisible pour un programmeur.