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']
Que faites-vous avec data_line? Êtes-vous simplement de l'itération? Êtes-vous le mettre dans un autre discbased?
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