Максимально быстрый разбор текстового файла

У меня есть очень большой файл со следующими строками:

....

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']] }

Вы пытались хранить списки кортежей вместо списков списков? Они должны быть более легкими и поэтому создаваться быстрее.

Gregor 09.02.2019 19:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
45
2

Ответы 2

Я предполагаю, что у вас есть фиксированное количество слов в файле, которые являются вашими ключами. Используйте 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 секунд в любом случае.

Raffaele Salzano 08.02.2019 15:41

В любом случае у меня есть 6 секунд, чтобы замедлиться для майской цели

Raffaele Salzano 08.02.2019 15:41

Я использовал разделение вместо разделения, чтобы тест «вход» и разделение можно было выполнить за один проход.

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

Это подскажет вам, каким будет ваше наилучшее возможное время.

Другие вопросы по теме