在大矩阵中搜索值
Posted
技术标签:
【中文标题】在大矩阵中搜索值【英文标题】:Searching values in a large matrix 【发布时间】:2016-08-26 01:15:32 【问题描述】:我正在使用 python 3.5 并且正在编写一个处理大型电子表格文件的脚本。电子表格的每一行都包含一个短语和几个其他相关值。我将文件解析为矩阵,但对于示例文件,它有超过 3000 行(甚至更大的文件应该在预期范围内)。我也有一个100字的清单。我需要搜索每个单词,矩阵的哪一行在其字符串中包含它,并基于此打印一些平均值。
目前我正在遍历矩阵的每一行,然后检查字符串是否包含任何提到的单词,但这个过程需要 3000 次迭代,每次检查 100 次。有没有更好的方法来完成这项任务?
【问题讨论】:
您是否尝试过并行化任务? 您能否提供一个最小的示例代码、与真实矩阵格式相同的小矩阵、要搜索的单词的简短列表和预期输出? 根据您问题的规模,是否可以使用其他解决方案,例如mysql之类的数据库?然后,您可以在您关心的查询字符串上简单地SELECT
,然后对关联的值执行操作。
【参考方案1】:
从长远来看,我会鼓励您使用更适合该任务的东西。例如,一个 SQL 数据库。
但如果你坚持编写自己的 python 解决方案,你可以做一些事情来优化它:
使用集合。集合具有非常有效的成员资格检查。
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
并行化。
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
【讨论】:
感谢您的回答,我没有想过并行化任务以上是关于在大矩阵中搜索值的主要内容,如果未能解决你的问题,请参考以下文章