2010-07-02 2 views
3

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

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++?

+1

Вы вызываете функцию, которая должна перебирать 800 символов, и вы делаете это более миллиона раз. Даже для компьютера это очень много для обработки. – tlayton

+2

http://docs.python.org/library/csv.html – kennytm

+1

Если вы планируете изобретать колесо, вы должны посмотреть следующее сообщение: http://stackoverflow.com/questions/3055477/how-slow- is-pythons-string-concatenation-vs-str-join также вы должны смотреть на генераторы. –

ответ

2

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

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

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

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

+1

Модуль timeit (http://docs.python.org/library/timeit.html) может помочь в определении того, как долго это происходит. – GreenMatt

+1

Я предложил быстрый и грязный метод, потому что, если вы не можете видеть * заметное замедление, то распределение памяти не является проблемой. – unutbu

2

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

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.