在大矩阵中搜索值

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

【讨论】:

感谢您的回答,我没有想过并行化任务

以上是关于在大矩阵中搜索值的主要内容,如果未能解决你的问题,请参考以下文章

在c ++中不同行或列旁边的矩阵中搜索最小值和最大值的最快方法是啥

在大表中查询“对”

在大文件中最省时的搜索 - Python

原创搜索引擎在大数据时代中的变革

搜索二维矩阵 II

搜索二维矩阵II