У меня есть очень большой файл со следующими строками:
....
0,040027 а б в г д 12 34 56 78 90 12 34 56
0,050027 ф г в л 12 34 56 78 90 12 34 56
0,060027 а б в г д 12 34 56 78 90 12 34 56
0,070027 ф г в л 12 34 56 78 90 12 34 56
0,080027 а б в г д 12 34 56 78 90 12 34 56
0,090027 ф г в л 12 34 56 78 90 12 34 56
....
Мне нужно иметь следующий словарь как можно быстрее.
Я использую следующий код:
ascFile = open('C:\\eample.txt', 'r', encoding='UTF-8')
tag1 = ' a b c d e '
tag2 = ' f g h i l '
tags = [tag1, tag2]
temp = {'k1':[], 'k2':[]}
key_tag = {'k1':tag1, 'k2':tag2 }
t1 = time.time()
for line in ascFile:
for path, tag in key_tag.items():
if tag in line:
columns = line.strip().split(tag, 1)
temp[path].append([columns[0], columns[-1].replace(' ', '')])
t2 = time.time()
print(t2-t1)
У меня есть следующий результат за 6 секунд при анализе файла размером 360 МБ, я хотел бы улучшить время.
temp = {'k1':[['0.040027', '1234567890123456'], ['0.060027', '1234567890123456'], ['0.080027', '1234567890123456']], 'k2':[['0.05'0027', 1234567890123456'], ['0.070027', '1234567890123456'], ['0.090027', '1234567890123456']] }






Я предполагаю, что у вас есть фиксированное количество слов в файле, которые являются вашими ключами. Используйте split, чтобы разбить строку, затем возьмите часть списка разделения, чтобы напрямую вычислить свой ключ:
import collections
# raw strings don't need \\ for backslash:
FILESPEC = r'C:\example.txt'
lines_by_key = collections.defaultdict(list)
with open(FILESPEC, 'r', encoding='UTF-8') as f:
for line in f:
cols = line.split()
key = ' '.join(cols[1:6])
pair = (cols[0], ''.join(cols[6:]) # tuple, not list, could be changed
lines_by_key[key].append(pair)
print(lines_by_key)
Количество слов может меняться от 0 до 8. Я получаю 6 секунд в любом случае.
В любом случае у меня есть 6 секунд, чтобы замедлиться для майской цели
Я использовал разделение вместо разделения, чтобы тест «вход» и разделение можно было выполнить за один проход.
for line in ascFile:
for path, tag in key_tag.items():
val0, tag_found, val1 = line.partition(tag)
if tag_found:
temp[path].append([val0, val1.replace(' ', '')])
break
Это лучше с вашим файлом 360 МБ?
Вы также можете выполнить простой тест, в котором все, что вы делаете, это перебираете файл построчно:
for line in ascFile:
pass
Это подскажет вам, каким будет ваше наилучшее возможное время.
Вы пытались хранить списки кортежей вместо списков списков? Они должны быть более легкими и поэтому создаваться быстрее.