2013-05-23 4 views
0

J'ai une liste:incrémenter dans une liste efficace

foo = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

Actuellement, j'incrémenter un nombre connu d'indices consécutifs d'une valeur donnée:

def increment(index, length, some_value, a_list): 
    for i in range(index, index+length): 
     a_list[i] += some_value 
    return a_list 
foo = increment(2,3,4,foo) 
# [0, 0, 4, 4, 4, 0, 0, 0, 0, 0] 

Cependant, le problème est que je faire cela sur une gamme de 50-100 "longueur" et ferait cela des millions de fois. Donc, ma boucle poserait un problème considérable au temps de calcul (je crois). Existe-t-il un moyen d'ajouter une valeur donnée à tous les indices dans une plage donnée sans avoir à parcourir les indices donnés?

Répondre

1

Simon Tatham a écrit quelque chose sur "Tableaux de fréquences cumulées": http://www.chiark.greenend.org.uk/~sgtatham/algorithms/cumulative.html Cela semble obtenir vous vous connecterez fois:

def increment(index, length, some_value, a_frequency_table): 
    // increment "frequency" of (index) by some_value 
    // decrement "frequency" of (index+length-1) by some_value 

Il relie également le code C sur le bas de la page. Si j'ai bien compris votre question, il devrait être possible de l'adopter.

+0

Mais cela peut nécessiter des modifications à d'autres codes en utilisant ce tableau. S'il s'agit d'un projet avec beaucoup de code et/ou de personnes, cela ne vaut peut-être pas le coup. –

+0

Cet algorithme fonctionnerait. Cela nécessite un peu de recodage, mais heureusement, il s'agit d'un projet d'un seul homme. Le gros problème est que je travaille avec un énorme jeu de données. Millions d'indices et des millions d'incréments, chaque incrément couvrant 50-100 indices. Pour couvrir le remède dont la mémoire a besoin pour tous les indices, j'ai un sous-index qui couvre le total théorique (sortie pour classer le passé), car mes incréments sont triés en commençant l'index. Cela modifiera encore l'algorithme fourni pour tenir compte des changements de fenêtre. – user1502381

0

Compte tenu de vos besoins, il me semble que vous faites cela correctement en ce qui concerne les performances. La seule chose que je peux voir pour améliorer les performances est très minuscule ... Je ne voudrais pas retourner le tableau, car il est inutile. Au-delà, tout a l'air sain.

def increment(index, length, some_value, a_list): 
for i in range(index, index+length): 
    a_list[i] += some_value 

increment(2,3,4,foo) 
# [0, 0, 4, 4, 4, 0, 0, 0, 0, 0] 
+0

Le retour était inutile. Juste pour clarifier le point dans le code. C'est en fait un objet avec un tableau mutable. – user1502381

Questions connexes