2016-03-11 4 views
0

Так что я борюсь с некоторым кодом внутри цикла, который будет работать миллионы раз. Я хотел бы знать, каким образом (в Python) проанализировать набор столбцов фиксированной ширины с разделителями пробелов с цифрами и преобразовать их в укороченную форму. Я буду цикл над данными, как это:Самый быстрый способ в Python для разбора чисел, разделенных пробелами

entry = "1  0 0 7  1 1 2 3 4 5 6  0" 

, и я в основном нужно вытащить 5-й, 7-й, 8-й, 9-й, и 10-й indicies для преобразования чисел в строки идентификатора.

Вариант 1: Так как данные фиксированной ширины, я мог бы сделать что-то вроде:

a,b,c,d,e = entry[28:33],entry[38:43],entry[43:48],entry[48:53],entry[53:59] 

вытащить цифры (с пробелами), а затем сформировать свою строку:

return "c"+a.strip()+"x"+b.strip()+"e"+c.strip()+"s"+d.strip()+"n"+e.strip() 

Вариант 2: Do расщепляет первый:

fields = entry.split() 
return "c"+fields[5]+"x"+fields[7]+"e"+fields[8]+"s"+fields[9]+"n"+fields[10] 

Для нескольких тестов вариант 2 работает примерно на 5% быстрее, чем вариант 1. Есть ли другие варианты здесь, которые могут быть быстрее? Может быть, регулярное выражение с группами? Производительность действительно имеет первостепенное значение, поэтому я готов использовать (с хорошими комментариями встроенное) то, что не является высокой удобочитаемостью.

+0

Вы, кажется, хорошо разбираетесь; почему бы не попробовать регулярное выражение и посмотреть. –

+0

В настоящее время я работаю над регулярным выражением, но мне так плохо в регулярных выражениях. Я не могу понять, как захватить несколько групп. Возможно, я должен глубже понять это. – Randy

+0

'entry.split()', а затем использовать индексы –

ответ

0

Если я правильно понимаю вас, entry.split() будет работать нормально. Вот пример, выводящий 5-й, 7-й, 8-й, 9-й и 10-й индексы для создания строкового идентификатора. Обратите внимание, что индекс начинается с 0, следовательно, цифры меньше.

entry = "1  0 0 7  1 1 2 3 4 5 6  0" 
elems = entry.split() 

string_id = 'c' + str(elems[4]) + 'x' + str(elems[6]) + 'e' + str(elems[7]) + 's' + str(elems[8]) + 'n' + str(elems[9]) # 'c1x2e3s4n5' 

print(string_id) # '12345' 

Лучшее время из многих трасс: 0.00183889195728

Лучшее время при выполнении варианта 1 из Вашего вопроса была: 0.00139979653864

Если вы дали несколько записей я мог бы работать лучше тесты производительности, но с ограниченные данные, это лучшее, что можно сделать сейчас. Если вам требуется больше скорости (это очень небольшие различия в производительности), не используйте Python. Использовать C.

+0

Вопрос не * работает * но *, который быстрее * –

+0

Номера не всегда имеют только одну цифру! – webNeat

+2

@webNeat это не имеет значения. 'entry.split()' будет обрабатывать его просто отлично. ''1 110 0 117 1 1 223 3 4 5 6 0" .split() = [' 1 ',' 110 ',' 0 ',' 117 ',' 1 ',' 1 ',' 223 ',' 3 ',' 4 ',' 5 ',' 6 ',' 0 '] ' –

Смежные вопросы