如何在python中加快搜索速度?

如何在python中加快搜索速度?,python,performance,search,int,Python,Performance,Search,Int,我正在从一个文件的行中搜索另一个文件的值。精确值在搜索文件中只出现一次。如何使此过程更快?这是我目前的代码: filltaxlist = open("file with query number.txt", "rw") fulltaxa = open("output file with hit line match", "rw") for line in filltaxalist: line = line.strip() taxid = re.split("\t", line)

我正在从一个文件的行中搜索另一个文件的值。精确值在搜索文件中只出现一次。如何使此过程更快?这是我目前的代码:

filltaxlist = open("file with query number.txt", "rw")
fulltaxa = open("output file with hit line match", "rw")

for line in filltaxalist:
    line = line.strip()
    taxid = re.split("\t", line)
    lookup = taxid[5] # this value is a number and I need the exact match only so I convert it to an integer
    int1 = int(lookup)
    for line in open("File to search.txt", "r"):
        data = re.split(',', line)
        hit = int(data[0]) # every value in this file is a number separated by a ,
        if lookup in line:
            if int1 == hit:
                fulltaxa.write(line)
这很好,因为它写得很慢。另外,我正在搜索的文件大小超过GB。

filltaxlist
行示例:

cvvel_1234    403454663    29.43    3e-30    55.55555555234    1172189
cvell_1444    2342333      30.00    1e-50    34.34584359345    5911
cvell_1444    234230055    23.23    1e-60    32.23445983454    46245
cvell_1444    233493003    23.44    1e-43    35.23595604593    46245
fulltaxa
应返回的内容:

1172189, 5943, 1002030, 12345
5911, 11234, 112356, 234, 3456, 44568, 78356
46245, 123, 3432456, 123488976, 23564, 334
46245, 123, 3432456, 123488976, 23564, 334
使用数据库 正如其他人提到的,最简单的方法可能是将其转储到db中(例如sqllite)。如果需要与该语言交互,可以使用python绑定

纯Python解决方案 对于
filltaxlist
中的每个条目,您完全读取
fulltaxa
(由于嵌套的顺序),首先缓存所有查询,然后只读取
fulltaxa
一次,然后对输出进行排序以恢复
fulltaxa
的顺序将更有效

由于查询的顺序是导入的,所以我们应该使用FIFO结构——在我们的例子中,a会很好地完成

from collections import defaultdict
filltaxlist = open("file with query number.txt", "rw")
fulltaxa = open("output file with hit line match", "rw")

possibles = {}
for i, line in enumerate(filltaxalist):
    line = line.strip()
    taxid = re.split("\t", line)
    lookup = taxid[5] # this value is a number and I need the exact match only so I covert it to an integer
    int1 = int(lookup)
    possibles[int1] = i

output_lines = defaultdict(list)
for line in open("File to search.txt", "r"):
    data = re.split(',', line)
    hit = int(data[0]) # every value in this file is a number separated by a ,
    if hit in possibles:
        output_lines[possibles[hit]].append(line)

fulltaxa.writelines(line for lines in output_lines.values() for line in lines)
当查询用完时,上面的代码将抛出一个索引器

其他一些小的改进

data = re.split(',', line)
可能比

data = line.split(',')
但你应该做一个简介,以确保这对你来说是有意义的

您的算法是O(m*n)。用字典来代替O(m+n)算法是可能的。即使m很小,它也可能是Python中的一个显著改进,在Python中,字典访问的常量因子与任何其他语句没有太大区别

filltaxalist = open("file with query number.txt", "rw")
fulltaxa = open("output file with hit line match", "rw")

filltaxadict = {}
for i, line in enumerate(filltaxalist):
    line = line.strip()
    taxid = re.split("\t", line)
    lookup = taxid[5] # this value is a number and I need the exact match only so I convert it to an integer
    int1 = int(lookup)

    filltaxadict[int1] = i

results = [[]] * len(filltaxadict)
for line in open("File to search.txt", "r"):
    data = re.split(',', line)
    hit = int(data[0]) # every value in this file is a number separated by a ,
    match = filltaxadict.get(hit)
    if match is not None:
        results[match].append(line)

for result in results:
    fulltaxa.writelines(result)

这将以正确的顺序处理重复的数据;如果不需要的话,稍微简单一点。要搜索的文件可以很大;这不会将其内容保留在内存中,只保留FillTaxList的(部分)内容,我认为它不是特别大。

你在
filltaxlist
中每行读一次文件,如果int==hit应该是
如果int1==hit
我想。filltaxlist非常大吗?filltaxlist将是~1-3万行。你基本上是在没有真正的数据库的情况下尝试进行表连接。如果您有足够的内存将
filltaxlist
中的数据放入一个列表(或者更好的是,使用taxid作为键的某种字典),那么就这样做。否则,您可能会调查将所有这些信息放入一个真正的datanase。谢谢您。集合是否只收集唯一的值?我最初将其读入列表,但FillTaxList中仍有重复的值必须搜索。set只收集唯一的值,如果需要知道每个值的实例数,请将其切换为a(例如,如果查询列表中有3个重复项,则要搜索前3个实例).为了使这个过程正常工作,发生的顺序、天气重复或唯一值是非常重要的,这就是为什么我要逐行进行讨论的原因。filltaxlist中的第1行必须与fulltaxa中的第1行匹配。为了清楚起见,我将在问题中添加每个文件的示例。这就是为什么我对这个答案有疑问的原因。“file to search.txt”在数据[0]上的顺序是数字的。它是否正是您希望按照
filltaxlist
中的查询顺序进行的输出?