【问题标题】:Tail on python. Best performance implementation蟒蛇尾。最佳性能实施
【发布时间】:2014-12-08 22:48:42
【问题描述】:

我是编程和 Python 的新手。
我写了一个实现unix尾部的函数:

def tail(file):
    strin = open(file, 'r')
    lis = strin.readlines()
    lastline = lis[-1]
    return lastline
    strin.close()

但我认为它在性能上并不是最优的。
我该如何改进?

【问题讨论】:

标签: python performance deque


【解决方案1】:

无需存储所有行,因为您只需要最后一行:

lis = strin.readlines()
lastline = lis[-1]

更有效的是根据Iterate through Python list and do something on last element 的答案:

for line in open(file, 'r'):
    pass
else:
    return line

(我不知道 Collections.deque 解决方案,我同意它更好,也可以为 n 行参数化)

【讨论】:

  • 有什么区别,你只是从问题中复制粘贴了两行。还是我错过了什么?
  • 我发现了浪费的部分,这正是 OP 所要求的。这就是你错过的。我只是编辑了更好的选择。否决票不是那么快。请反转。
  • 不,问题是“我该如何改进?”。不是“哪个部分不好”。看起来您试图提出建议,但只复制了相同的部分。另外我认为您的解决方案没有任何改进,因为readlines() 无论如何都会将整个文件加载到内存中,然后进行迭代。所以这两种解决方案本质上是相同的。您应该使用readline() 来逐一处理行,然后您将获得更好的内存约束解决方案。
  • @grc, luk32: 所以我们通过直接迭代 open(file, 'r') 来消除 readlines()
  • 好人,我没有攻击你的阅读理解,只是贬低了你对不完整答案的辩护。 IMO 根本没有帮助。 “我该如何改进”与“它在哪里次优”不同,不同之处在于,提出了一项改进,而第 1 次修订甚至没有尝试去做。
【解决方案2】:

你可以从Collections.deque使用这个食谱

def tail(filename, n=10):
    'Return the last n lines of a file'
    return deque(open(filename), n)

参考这个:- https://docs.python.org/2/library/collections.html#deque-recipes

【讨论】:

  • 这是唯一正确的 Python 处理方式,我找到了 100 多个答案,都涉及子进程或循环遍历整个文件。这个问题是先加载一个包含数千行的日志文件,然后再循环最后 100 行似乎效率低下,
【解决方案3】:

您的代码存在一些问题。首先,您在返回后关闭文件。 return 语句之后的所有内容都不会到达。其次,当你处理文件时,你应该使用with。它会打开您的文件,当它离开块时,它会为您关闭它。最后,您可以将三行合并为一个单行。

我会这样写:

def tail(file):
    with open(file, 'r') as o:
        return o.readlines()[-1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2010-10-27
    • 2011-05-29
    • 2012-03-13
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多