【问题标题】:Searching python text file without for loops and if statments在没有 for 循环和 if 语句的情况下搜索 python 文本文件
【发布时间】:2020-02-28 14:09:42
【问题描述】:

有没有办法在 python 中搜索文本文件中的短语而不必使用 forloops 和 if 语句,例如:

for line in file:
    if line in myphrase:
        do something

这似乎是一种非常低效的文件浏览方式,因为如果我理解正确,它不会并行运行,而是迭代运行。 re.search 是一个更有效的系统吗?

【问题讨论】:

  • 你考虑过正则表达式吗?它可能仍然可以线性工作(即单个线程作为一个系列扫描文本),但任何循环都会对您隐藏。循环并没有那么糟糕,事实上,它们是计算机最擅长的。或者,您可以强制并行化处理文件不同部分的一系列线程,但随后您必须管理它们的同步和串扰,这可能超过您在第一名。
  • 如果您有任何效率问题,也许您应该考虑任何类型的预处理。它可以帮助你。
  • @ThomasKimber 我看过它们,但听说它们在大文件上也可能很慢。让我感到奇怪的是,这里没有并行化方法。
  • 我怀疑正则表达式会为您节省任何时间。有些人指出,一次读取文件的内容会更快,这对于合理大小的文件来说是正确的。但是,如果它是一个大文件,则将整个文件读入内存也会导致性能下降。我个人会采取简单的方法,并完全按照您在这里所做的事情。这很方便,因为它按换行符拆分,这可能不是您的短语的一部分。如果您必须通过读取更大的块来进行优化,您必须注意您可能会在块边界处拆分您的短语

标签: python python-3.x


【解决方案1】:

读取顺序文件(例如文本文件)始终是一个顺序过程。除非您可以将其存储在单独的块中或以某种方式向前跳过,否则将很难进行任何并行处理。

您可以做的是将固有的顺序读取过程与搜索过程分开。这要求文件内容自然地分成块(例如行),搜索不打算在这些块中找到结果。

一般结构如下所示:

  • 使用输入队列启动处理线程列表
  • 逐行读取文件并将行块累积到给定阈值
  • 当达到阈值或文件末尾时,将行块添加到下一个处理线程的输入队列中
  • 等待所有处理线程完成
  • 合并所有搜索线程的结果。

在这个固态驱动器和快速内存总线的时代,您需要一些非常引人注目的约束因素来证明这样做是有道理的。

您可以通过测量读取(不处理)最大文件中的所有行所需的时间来计算最短处理时间。 鉴于读取数据的 I/O(即使在 SSD 上)将花费比搜索操作的 CPU 时间长得多的时间,因此每行的搜索过程不太可能增加太多时间。

【讨论】:

    【解决方案2】:

    假设你有文件:

    Hello World!
    I am a file.
    

    然后:

    file = open("file.txt", "r")
    x = file.read()
    # x is now:
    "Hello World!\nI am a file."
    # just one string means that you can search it faster.
    # Remember:
    file.close()
    

    编辑:

    实际测试需要多长时间:

    import time
    start_time = time.time()
    # Read File here
    end_time = time.time()
    print("This meathod took " + str( end_time - start_time ) + " seconds to run!")
    

    另一个编辑:

    我阅读了其他一些文章并进行了测试,如果您只是想找出真假,最快的检查方法是:

    x = file.read() # "Hello World!\nI am a file."
    tofind = "Hello"
    tofind_in_x = tofind in x
    # True
    

    在我的测试中,这种方法比正则表达式快很多。

    【讨论】:

    • 嗯,这是一种非常有趣的观察方式。但是我担心大文件会变得很慢?
    • 根据大文件大小,它可能会更慢所以不管你做什么。最好通过创建一个大型查找并测试不同的方法来进行测试。您可以使用 The edit to my awnser 测试他们花费的时间
    【解决方案3】:

    你需要的工具叫做正则表达式(regex)。

    你可以按如下方式使用它:

    import re
    
    if re.match(myphrase, myfile.read()):
        do_something()
    

    【讨论】:

    • 我以前读过有人说正则表达式在大文件上速度很慢,这是真的吗?如果是这样,什么被认为是大文件?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多