Python быстрый разбор строк, манипулирование - PullRequest
3 голосов
/ 02 июля 2010

Я использую python для разбора входящей через запятую строки.Я хочу сделать некоторые вычисления впоследствии на данных.Длина строки: 800 символов с 120 полями, разделенными запятыми.Там такие 1,2 миллиона строк обработать.

for v in item.values():
         l.extend(get_fields(v.split(',')))  
#process l 

get_fields использует operator.itemgetter () для извлечения около 20 полей из 120.

Вся эта операция занимает около 4-5 минут без учета времени на ввод данных.В более поздней части программы я вставляю эти строки в таблицу памяти sqlite для дальнейшего использования.Но в целом 4-5 минут просто для анализа и получения списка не подходят для моего проекта.

Я выполняю эту обработку в 6-8 потоках.

Переключается ли на C / C ++может помочь?

Ответы [ 2 ]

2 голосов
/ 03 июля 2010

Вы загружаете файл с вашими записями?Вероятно, лучше обрабатывать данные напрямую:

datafile = file("file_with_1point2million_records.dat")
# uncomment next to skip over a header record
# file.next()

l = sum(get_fields(v.split(',')) for v in file, [])

Это позволяет избежать создания каких-либо общих структур данных и накапливать только нужные значения, возвращаемые get_fields.

2 голосов
/ 02 июля 2010

Ваша программа может замедляться, пытаясь выделить достаточно памяти для строк размером 1,2 млн. Другими словами, проблема со скоростью может быть связана не с синтаксическим анализом / манипулированием строк, а скорее с l.extend. Чтобы проверить эту гипотезу, вы можете поместить оператор print в цикл:

for v in item.values():
    print('got here')
    l.extend(get_fields(v.split(',')))  

Если операторы печати становятся все медленнее и медленнее, вы, вероятно, можете сделать вывод, что l.extend является виновником. В этом случае вы можете увидеть значительное улучшение скорости, если вы можете переместить обработку каждой строки в цикл.

PS: Вы, вероятно, должны использовать модуль csv, чтобы позаботиться о разборе для вас более высоким способом, но я не думаю, что это сильно повлияет на скорость.

...