1. Trate de leer todo el archivo
Una velocidad se puede hacer es leer todo el archivo en la memoria si es posible, de lo leído en trozos. Usted dijo 'varios hudred mil líneas' Digamos que 1 millón de líneas con cada línea 100 Char es decir, alrededor de 100 MB, si usted tiene esta cantidad de memoria libre (supongo que tienes) acaba de hacer esto
big_file = open('C:\\gbigfile.txt', 'r')
big_file_lines = big_file.read_lines()
big_file.close()
small_file3 = open('C:\\small_file3.txt', 'w')
for line in big_file_lines:
if 'S0414' in line:
small_file3.write(line)
small_file3.close()
Tiempo esto con orginal versión y ver si hace la diferencia, creo que lo hará.
Pero si su archivo es realmente grande en GBs, entonces puede leerlo en fragmentos, p. Ej. 100 MB trozos, divídalo en líneas y busque pero no olvide unir líneas en cada intervalo de 100MB (puedo elaborar más si este es el caso)
file.readlines devuelve una lista que contiene todas las líneas de datos en el archivo . Si se le da un parámetro opcional sizehint, lee tantos bytes del archivo y más para completar una línea, y devuelve las líneas de eso. Esto se usa a menudo para permitir la lectura eficiente de un archivo grande por líneas, pero sin tener que cargar todo el archivo en la memoria. Solo se devolverán las líneas completas.
Consulte también el siguiente enlace para ver la diferencia de velocidad entre línea por línea y la lectura de todo el archivo. http://handyfloss.wordpress.com/2008/02/15/python-speed-vs-memory-tradeoff-reading-files/
2.Trate de escribir el archivo de toda
También puede escribir la línea tienda y ellos a la vez al final, aunque no estoy seguro de si ayudará mucho
big_file = open('C:\\gbigfile.txt', 'r')
big_file_lines = big_file.read_lines()
small_file_lines = []
for line in big_file_lines:
if 'S0414' in line:
small_file_lines.append(line)
small_file3 = open('C:\\small_file3.txt', 'w')
small_file3.write("".join(small_file_lines))
small_file3.close()
3. filtro tratan de
También puede intentar utilizar el filtro, en lugar del lazo, ver si hace la diferencia
small_file_lines= filter(lambda line:line.find('S0414') >= 0, big_file_lines)
Creo que todas las respuestas hasta ahora no entienden bien su pregunta. Si lo entiendo, no estás buscando acelerar tu ciclo. En cambio, tiene 30,000 cadenas similares a 'S0414', y quiere encontrar una manera de encontrar cada ocurrencia de cada una. Es esto lo que estás buscando? – Wilduck
Necesito encontrar S0414 y GT213 y AT3423 y PR342 y hay 30,000 cosas diferentes que necesito encontrar. ¿Puedo encontrar los 30,000 a la vez sin hacer que este programa tenga una línea para cada uno de los nombres que necesito encontrar? THEN mi programa tendrá 30,000 líneas, lo cual es problemático. – novak
¿'S0414' y' GT213', etc. aparecen en el mismo lugar del bigfile como Nick pregunta? http://stackoverflow.com/questions/3248395/extract-specific-text-lines/3248603#3248603 –