Python readlines () uso y práctica eficiente para leer

Tengo un problema para analizar miles de archivos de texto (alrededor de 3000 líneas en cada archivo de tamaño de ~ 400 KB) en una carpeta. Los leí usando readlines,

   for filename in os.listdir (input_dir) :
       if filename.endswith(".gz"):
          f = gzip.open(file, 'rb')
       else:
          f = open(file, 'rb')

       file_content = f.readlines()
       f.close()
   len_file = len(file_content)
   while i < len_file:
       line = file_content[i].split(delimiter) 
       ... my logic ...  
       i += 1  

Esto funciona completamente bien para la muestra de mis entradas (50,100 archivos). Cuando ejecuté en toda la entrada más de 5K archivos, el tiempo empleado no se acercó al incremento lineal. Planeé hacer un análisis de rendimiento e hice un análisis de perfil de C. El tiempo que se tarda en aumentar la cantidad de archivos aumenta exponencialmente al alcanzar tasas más bajas cuando las entradas llegan a archivos 7K.

Aquí está el tiempo acumulado para las líneas de lectura, primero -> 354 archivos (muestra de entrada) y segundo -> 7473 archivos (entrada completa)

 ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 354    0.192    0.001    **0.192**    0.001 {method 'readlines' of 'file' objects}
 7473 1329.380    0.178  **1329.380**    0.178 {method 'readlines' of 'file' objects}

Debido a esto, el tiempo que tarda mi código no se escala linealmente a medida que aumenta la entrada. Leí algunas notas de docreadlines(), donde la gente ha afirmado que estareadlines() lee todo el contenido del archivo en la memoria y, por lo tanto, generalmente consume más memoria en comparación conreadline() oread().

Estoy de acuerdo con este punto, pero ¿debería el recolector de basura borrar automáticamente el contenido cargado de la memoria al final de mi bucle, por lo tanto, en cualquier momento, mi memoria debería tener solo el contenido de mi archivo procesado actualmente? Pero, hay algo de captura aquí. ¿Alguien puede dar algunas ideas sobre este tema.

¿Es este un comportamiento inherente dereadlines() o mi interpretación equivocada del recolector de basura de pitón. Contento de saber.

Además, sugiera algunas formas alternativas de hacer lo mismo en la memoria y de manera eficiente en el tiempo. TIA.

Respuestas a la pregunta(2)

Su respuesta a la pregunta