我有一个包含一些内容的文本文件。 我需要经常搜索此内容。 我有以下两种选择,哪一种是最好的(通过更快的执行速度)?

方法1:

def search_list(search_string):
    if search_word in li:
        print "found at line ",li.indexOf(search_word)+1

if __name__="__main__":
    f=open("input.txt","r")
    li=[]
    for i in f.readlines():
        li.append(i.rstrip("\n"))
    search_list("appendix")

方法2:

def search_dict(search_string):
    if d.has_key(search_word):
        print "found at line ",d[search_word]

if __name__="__main__":
    f=open("input.txt","r")
    d={}
    for i,j in zip(range(1,len(f.readlines())),f.readlines()):
        d[j.rstrip("\n")]=i
    search_dict("appendix")

#1楼 票数:2

如果您确实经常这样做,那么第二种方法会更快(您已经建立了类似索引的内容)。

稍微调整一下即可:

def search_dict(d, search_string):
    line = d.get(search_string)
    if line:
        print "found at line {}".format(line)
    else:
        print "string not found"

d = {}
with open("input.txt", "r") as f:
    for i, word in enumerate(f.readlines(), 1):
        d[word.rstrip()] = i
search_dict(d, "appendix")

#2楼 票数:2 已采纳

对于频繁搜索,字典肯定更好(只要您有足够的内存来存储行号),因为在O(1)操作中对键进行了散列和查找。 但是,您的实现无法正常工作。 第一个f.readlines()将耗尽文件对象,而第二个f.readlines()则不会读取任何内容。

您正在寻找的是enumerate

with open('data') as f:
    d = dict((j[:-1],i) for i,j in enumerate(f,1))

还应该指出的是,在两种情况下,如果您通常使用try/except进行查找,则执行搜索的功能将更快,前提是通常找到了要查找的索引。 (在第一种情况下,无论如何它可能会更快,因为inN阶操作,列表的.index也是如此)。

例如:

def search_dict(d, search_string):
    try:
        print "found at line {0}".format(d[search_string])
    except KeyError:
        print "string not found"

或列表:

def search_list(search_string):
    try:
        print "found at line {0}".format(li.indexOf(search_word)+1)
    except ValueError:
        print "string not found"

#3楼 票数:1

在阅读eumiro和mgilson的答案后,我将其发布。

如果您在命令行上比较这两种方法,我想您会发现第一种更快。 表示第二种方法的其他答案更快,但是它们的前提是您在建立索引后对文件进行多次搜索。 如果从命令行按原样使用它们,则不会。

索引的建立比直接搜索字符串要慢 ,但是一旦建立了索引,就可以非常快速地完成搜索,从而弥补了建立索引所花费的时间。 如果只使用一次,则将浪费额外的时间,因为在程序完成后,索引将被丢弃,并且在下一次运行时必须重新构建索引。 您需要在两次查询之间将创建的索引保留在内存中,以得到回报。

有多种方法可以执行此操作,一种方法是使守护进程保存索引并使用前端脚本对其进行查询。 在Google上搜索诸如python daemon client communication内容将为您提供实现此操作的指导- 这是一种方法

#4楼 票数:0

第一个是O(n); 第二个是O(1),但它需要在键上进行搜索。 我会选第二个。

如果您在文档中进行临时搜索,那么这两种方法都不会起作用。 为此,您需要使用Lucene之类的方法进行解析和索引。

#5楼 票数:0

抛出的另一种选择是使用SQLite3提供的FTS ...(未经测试,并假设您要查找整个单词,而不是单词的子字符串或其他类似的东西)

import sqlite3

# create db and table
db = sqlite3.connect(':memory:') # replace with file on-disk?
db.execute('create virtual table somedata using fts4(line)')

# insert the data
with open('yourfile.txt') as fin:
    for lineno, line in enumerate(fin):
        # You could put in a check here I guess...
        if somestring in line:
            print lineo # or whatever....
        # put row into FTS table
        db.execute('insert into somedata (line) values (?)', (line,))
    # or possibly more efficient
    db.executemany('insert into somedata (line) values (?)', fin)
db.commit()

look_for = 'somestring'
matches = db.execute('select rowid from somedata where line match ?', (look_for,) )
print '{} is on lines: {}'.format(look_for, ', '.join(match[0] for match in matches))

如果只需要第一行,则将limit 1添加到查询的末尾。

您还可以查看使用mmap映射文件,然后使用.find方法获取字符串的最早偏移量,然后假设它不是-1 (即未找到-假设为123456),然后执行mapping_file [:123456 ] .count('\\ n')+1以获取行号。

  ask by Vivek S translate from so

未解决问题?本站智能推荐:

1回复

Python:是否有使用多个键(类似于数据库)的优化字典类型?

即允许您像在数据库中一样有效地访问和更新数据。 我的具体情况如下: 我有一个非常大的蒙特卡罗模拟+优化,数据被分类为几个字典,每个字典有600k +元组键,格式如下: 事实证明,上面的内容实际上比嵌套字典稍慢: 这让我相信 - 如果我错了,请纠正我 - 后一种格式检查
1回复

如果数据冗余,有效地重用预建词典的方法? 深度复制太慢

我有一个代码,其中涉及从预先计算的数据(即,具有许多查找)构建一个非常大的字典。 它使用四整数元组作为键,并使用元组列表作为项。 然后使用每个键的附加功能更新此词典(以便可以在以后的阶段对每个项目进行排序)。 重复上述过程数千次,但是原始(基本)字典保持不变。 原始字典的大小与更新的大小
1回复

如何使用字典理解编写以下代码

需要帮助使用字典理解来优化以下 python 代码。 如何以使用 python 特殊功能的方式修改我的代码
4回复

这是在Python中搜索一组“范围”对象中的值的最快方法

我有很多这样的Python对象的列表: 然后,我有一个RangeClass对象的列表(rangelist)。 我需要找到给定值在哪个范围内。 我可以使用如下代码: 但是我认为有一种更快的方法。 范围具有任意大小,但是我们可以假定它们没有重叠。 谢谢。
2回复

优化短语中字符串的搜索。 不知道我需要使用哪种Python结构

我有一个文件,其中包含几个单词后跟一个整数(它的重量): 等等。 我需要对一些短语进行加权,如果它们匹配,则使用它们的单词和包含在前一个文件中的单词。 “我住在一个大城市的房子里”这句话重量0 + 0 + 0 + 0 + 15 + 0 + 0 + 10 + 50 = 75
2回复

如何使以下python程序(代码)更高效?

假设数据很大,则解决以下问题的任何有效方法。 我解决了问题,但是如何改进代码,这将使其变得高效。 有什么建议么? 数据: 输出: 抱歉,无法正确注释代码。 我更担心跑步时间。 谢谢..
2回复

Python:如何对字典数据进行排序和组织

我正在尝试按邮政编码对犯罪总数进行排序,并按犯罪类型对受害者计数进行排序。 我已经按报告号建立了词典。 这是我在打印字典时输出的一小部分数据示例: 该词典的结构如下:{Report_number:[邮政编码,犯罪类型,受害者人数]} 我是编码的新手,只是在学习字典。 我将如何
2回复

是否有适合此问题的数据结构或优化?

我有一个Node.JS服务器,我有一个字典(哈希/地图)(键是数字,值 - 数组)。 字典的每个元素都是一个ID(字符串)数组,并且有许多元素。 数组的每个元素在其数组中都是唯一的。 例如: let map = {2333:['id1', 'id2', 'id3', 'id4'], 1