Mam plik z dużą ilością odcinków w następującym formacie:Jak szybciej iterować w tym pliku tekstowym?
section_name_1 <attribute_1:value> <attribute_2:value> ... <attribute_n:value> {
field_1 finish_num:start_num some_text ;
field_2 finish_num:start_num some_text ;
...
field_n finish_num:start_num some_text;
};
section_name_2 ...
... and so on
Plik może być setki tysięcy linii długich. Liczba atrybutów i pól dla każdej sekcji może być różna. Chciałbym zbudować kilka słowników, aby zachować niektóre z tych wartości. Mam już oddzielny słownik, który zawiera wszystkie możliwe wartości "atrybutu".
import os, re
from collections import defaultdict
def mapFile(myFile, attributeMap_d):
valueMap_d = {}
fieldMap_d = defaultdict(dict)
for attributeName in attributeMap_d:
valueMap_d[attributeName] = {}
count = 0
with open(myFile, "rb") as fh:
for line in fh:
# only look for lines with <
if '<' in line:
# match all attribute:value pairs inside <> brackets
attributeAllMatch = re.findall(r'<(\S+):(\S+)>', line)
attributeAllMatchLen = len(attributeAllMatch)
count = 0
sectionNameMatch = re.match(r'(\S+)\s+<', line)
# store each section name and its associated attribute and value into dict
for attributeName in attributeMap_d:
for element in attributeAllMatch:
if element[0] == attributeName:
valueMap_d[attributeName][sectionNameMatch.group(1).rstrip()] = element[1].rstrip()
count += 1
# stop searching if all attributes in section already matched
if count == attributeAllMatchLen: break
nextLine = next(fh)
#in between each squiggly bracket, store all the field names and start/stop_nums into dict
#this while loop is very slow...
while not "};" in nextLine:
fieldMatch = re.search(r'(\S+)\s+(\d+):(\d+)', nextLine)
if fieldMatch:
fieldMap_d[sectionNameMatch.group(1)][fieldMatch.group(1)] = [fieldMatch.group(2), fieldMatch.group(3)]
nextLine = next(fh)
return valueMap_d
Moim problemem jest to, że pętla while, że pasuje do wszystkich wartości pól jest zauważalnie wolniej niż w pozostałej części kodu: 0.5s 2.2s vs. według cProfile jeśli usunąć pętli while. Zastanawiam się, co mogę zrobić, żeby to przyspieszyć.
Możesz użyć generatora z wyrażeniem regularnym - jeśli dostarczysz prawdziwe próbki, możesz być w stanie pomóc ci lepiej. – Jan
Ile to wolniej? –
@Jan Nie mogę dostarczyć oryginalnego pliku, ale zobaczę, czy sam mogę utworzyć próbkę. – Colin