2016-05-01 2 views
1

Im работает с python 3.5 и Im пишет сценарий, который обрабатывает большие файлы электронных таблиц. Каждая строка таблицы содержит фразу и несколько других соответствующих значений. Я разбираю файл как матрицу, но для файла примера он имеет более 3000 строк (и даже большие файлы должны быть в ожидании). У меня также есть список из 100 слов. Мне нужно искать каждое слово, какая строка матрицы содержит его в своей строке, и печатать на нем некоторые средние значения.Поиск значений в большой матрице

В настоящее время я выполняю итерацию по каждой строке матрицы, а затем проверяю, содержит ли строка какие-либо из указанных слов, но этот процесс занимает 3000 итераций, причем 100 проверок для каждого из них. Есть ли лучший способ выполнить эту задачу?

+0

Вы пытались распараллелить задачу? – jtitusj

+1

Не могли бы вы предоставить минимальный примерный код, малую матрицу с тем же форматом, что и реальный, короткий список слов для поиска и ожидаемого вывода? – niemmi

+1

В зависимости от масштаба вашей проблемы можно ли использовать другое решение, например. база данных, как MySQL? Затем вы можете просто «ВЫБРАТЬ» в строках запроса, о которых вы заботитесь, затем выполните операцию над связанными значениями. –

ответ

1

В конечном счете, я бы рекомендовал вам использовать что-то более подходящее для задачи. Например, база данных SQL.

Но если придерживаться написания собственного решения питона, вот некоторые вещи, которые вы можете сделать, чтобы оптимизировать его:

Используйте наборы. Наборы имеют очень эффективную проверку членства.

wordset_100 = set(worldlist_100) 

for row in data_3k: 
    word_matches = wordset_100.intersect(row.phrase.split(" ")) 
    for match in word_matches: 
     # add to accumulator 
     # this loop will be run less than len(row.phrase.split(' ')) times 
     pass 

Parallelize.

from multiprocessing import Pool 
from collections import defaultdict 


def matches(wordset_100, row): 
    return wordset_100.intersect(row.phrase.split(" ")), row 


if __name__ == "__main__": 
    accu = defaultdict(int) 
    p = Pool() 
    wordset_100 = set(worldlist_100) 
    for m, r in p.map(matches, data_3k): 
     for word in m: 
      accu[word] += r.number 
+0

Спасибо за ответ, я не думал о распараллеливании задачи – Silver

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