Considérese una larga lista de elementos con nombre (primera línea) regresó de un archivo csv grande (80 MB) con una posible separación interrumpidoLista de acceso de artículos con la lista de índices
name_line = ['a',,'b',,'c' .... ,,'cb','cc']
Estoy leyendo el resto de la datos en línea por línea y solo necesito procesar datos con un nombre correspondiente. Los datos pueden parecerse a
data_line = ['10',,'.5',,'10289' .... ,,'16.7','0']
Lo intenté de dos maneras. Uno está haciendo estallar las columnas vacías de cada línea de la leen
blnk_cols = [1,3, ... ,97]
while data:
...
for index in blnk_cols: data_line.pop(index)
el otro está recopilando los elementos asociados a un nombre de L1
good_cols = [0,2,4, ... ,98,99]
while data:
...
data_line = [data_line[index] for index in good_cols]
en los datos que estoy usando definitivamente habrá más buenas líneas y malas líneas, aunque podría ser tan alto como la mitad y la mitad.
Utilicé el paquete cProfile y pstats para determinar mis enlaces más débiles en velocidad, lo que sugería que el pop era el elemento más lento actual. Cambié a la lista de comp y el tiempo casi se duplicó.
Imagino que una forma rápida sería cortar la matriz recuperando solo datos buenos, pero esto sería complicado para los archivos con datos en blanco alternativos y buenos.
lo que realmente necesita es ser capaz de hacer
data_line = data_line[good_cols]
que pasa efectivamente una lista de índices en una lista para volver a dichos elementos. Ahora mi programa se ejecuta en aproximadamente 2,3 segundos para un archivo de 10 MB y las cuentas pop durante aproximadamente .3 segundos.
¿Hay alguna manera más rápida de acceder a ciertas ubicaciones en una lista? En C, simplemente estaría desreferenciando una matriz de punteros a los índices correctos en la matriz.
Adiciones: name_line en archivo antes de leer
a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n,
name_line después de leer y división ("")
['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n']
¿Qué estás haciendo con data_line? ¿Estás simplemente iterando? ¿Lo estás poniendo en otra estructura de datos? – Marcin
Además, ¿ha probado un generador? – Marcin
"¿Considera la posibilidad de devolver una lista grande de un archivo csv grande? ¿Estás leyendo el ** archivo ** completo en una lista? ¿Por qué? ¿Por qué no procesar cada línea individualmente? –