Accéder à la liste des éléments avec la liste des indices
Envisager une grande liste d'éléments nommés (première ligne) retour d'un grand fichier csv (80 MO) avec une possible interruption de l'espacement
name_line = ['a',,'b',,'c' .... ,,'cb','cc']
Je suis de lire la suite des données ligne par ligne et je n'ai besoin de traiter des données avec un nom correspondant. Les données peuvent ressembler à
data_line = ['10',,'.5',,'10289' .... ,,'16.7','0']
J'ai essayé les deux façons. Une popping est le vide des colonnes de chaque ligne de la lire
blnk_cols = [1,3, ... ,97]
while data:
...
for index in blnk_cols: data_line.pop(index)
l'autre est en train de compiler les éléments associés à un nom de L1
good_cols = [0,2,4, ... ,98,99]
while data:
...
data_line = [data_line[index] for index in good_cols]
dans les données que j'utilise il y aura certainement plus de bonnes lignes de mauvaises lignes, bien qu'il pourrait être aussi élevé que la moitié et la moitié.
J'ai utilisé le cProfile et pstats paquet pour déterminer mon maillons les plus faibles de la vitesse qui a suggéré la pop est le plus lent de l'élément. Je suis passé à la liste comp et le temps a presque doublé.
J'imagine un moyen rapide serait de découper le tableau récupérant uniquement des données de bonne qualité, mais ce serait compliqué pour les fichiers avec l'alternance de vides et de bonnes données.
ce que j'ai vraiment besoin, c'est d'être capable de faire
data_line = data_line[good_cols]
efficacement en passant une liste d'indices dans une liste de revenir ces éléments.
Maintenant mon programme est en cours d'exécution dans environ 2,3 secondes pour un fichier de 10 MO et les comptes pop pour environ .3 secondes.
Est-il un moyen plus rapide pour accéder à certains endroits dans une liste. En C, il serait juste de-la référence à un tableau de pointeurs vers les corriger indices dans le tableau.
Ajouts:
name_line dans le fichier avant de le lire
a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n,
name_line après l'avoir lu et split(",")
['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n']
Aussi, avez-vous essayé un générateur?
"Prenez un vaste liste retournée par un grand fichier csv "? Êtes-vous de lire le fichier dans une liste? Pourquoi? Pourquoi ne pas traiter chaque ligne individuellement?
le fichier que je lis une augmentation de la fréquence de fichier (c'est à dire 10 hz). Je lis dans les lignes et de l'accumulation et de la moyenne de toutes les valeurs x secondes d'intervalle et de l'écriture dans un fichier. ie aller de 10 hz à 1 hz accumuler des 10 valeurs de données (de 0 à 1 secondes) la moyenne et la sortie de la seule ligne de données dans un fichier pour l'étage(en temps) de la moyenne de la plage de données
Je suis le traitement de chaque ligne individuellement. Editted que pour plus de clarté
OriginalL'auteur Paul Seeb | 2012-01-25
Vous devez vous connecter pour publier un commentaire.
Essayer un générateur d'expression,
Également lire ici à propos de
Générateur d'Expressions vs Compréhension de Liste
que la réponse sommet, vous dit: "Fondamentalement, l'utilisation d'un générateur d'expression si tout ce que vous faites est d'itération d'une fois'.
De sorte que vous devriez profiter de cette.
Oui, de clarifier ma réponse.
Refait tout mon code pour l'adapter générateur d'expressions. Je vais à travers chaque ligne de données une fois pour le processus (à l'aide d'un générateur avec une indexation appropriée au lieu d'éclater les valeurs vides au départ). Le code s'exécute .3 secondes plus lent parce que j'ai besoin de recréer le générateur d'expression pour chaque ligne de données.
Je suis confus. création le générateur d'expression ne devrait pas prendre de temps.
il y a 25000 lignes de ce fichier. J'ai besoin de faire un nouveau générateur pour chaque ligne à traiter toutes les données dans la ligne, sauf si je peux "reset", le générateur pour chaque ligne. J'ai fait quelques recherches et trouvé que c'était impossible.
OriginalL'auteur Johan Lundberg