跟踪python。最佳性能实现

跟踪python。最佳性能实现,python,performance,deque,Python,Performance,Deque,我对编程和Python都是新手。 我编写了一个实现unix尾部的函数: def tail(file): strin = open(file, 'r') lis = strin.readlines() lastline = lis[-1] return lastline strin.close() 但我认为它的性能不是最佳的。 如何改进?无需存储所有行,因为您只需要最后一行: lis = strin.readlines() lastline = lis[-

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

def tail(file):
    strin = open(file, 'r')
    lis = strin.readlines()
    lastline = lis[-1]
    return lastline
    strin.close()
但我认为它的性能不是最佳的。

如何改进?

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

lis = strin.readlines()
lastline = lis[-1]
根据以下答案,效率更高:


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

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

lis = strin.readlines()
lastline = lis[-1]
根据以下答案,效率更高:


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

您可以从
Collections.deque

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

请参阅:-

您可以从
系列中使用此配方。deque

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

请参阅:-

您的代码有几个问题。首先,在返回后关闭文件。返回语句之后的所有内容都将无法访问。第二,在处理文件时,应将
一起使用。它将打开您的文件,当它离开块时,它将为您关闭它。最后,您可以将三行合并为一行

我会这样写:

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

您的代码有几个问题。首先,在返回后关闭文件。返回语句之后的所有内容都将无法访问。第二,在处理文件时,应将
一起使用。它将打开您的文件,当它离开块时,它将为您关闭它。最后,您可以将三行合并为一行

我会这样写:

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

有什么区别,你只是复制粘贴的两行问题。还是我遗漏了什么?我确定了浪费的部分,这正是OP所要求的。这就是你错过的。我只是编辑了更好的选择。反对票投得不那么快。请反驳。不,问题是“我怎样才能提高?”。不是“哪部分不好”。看起来你试图提出建议,但只是照搬了同一部分。另外,我不认为您的解决方案有任何改进,因为
readlines()
无论如何都会将整个文件加载到内存中,然后进行迭代。因此,这两种解决方案本质上是相同的。你应该使用
readline()
,一行一行地处理,然后你会有一个更好的内存约束解决方案。@grc,luk32:所以我们通过直接迭代
open(file,'r')
来避免
readlines()
。好家伙,我没有攻击你的阅读理解,只是轻视了你对不完整答案的辩护。在国际海事组织,“我如何改进”与“哪里是次优的”完全不同,区别在于,提出改进,第1次修订甚至没有尝试。有什么区别,你只是从问题中复制粘贴了两行。还是我遗漏了什么?我确定了浪费的部分,这正是OP所要求的。这就是你错过的。我只是编辑了更好的选择。反对票投得不那么快。请反驳。不,问题是“我怎样才能提高?”。不是“哪部分不好”。看起来你试图提出建议,但只是照搬了同一部分。另外,我不认为您的解决方案有任何改进,因为
readlines()
无论如何都会将整个文件加载到内存中,然后进行迭代。因此,这两种解决方案本质上是相同的。你应该使用
readline()
,一行一行地处理,然后你会有一个更好的内存约束解决方案。@grc,luk32:所以我们通过直接迭代
open(file,'r')
来避免
readlines()
。好家伙,我没有攻击你的阅读理解,只是轻视了你对不完整答案的辩护。这对IMO毫无帮助。“我如何改进”与“哪里是次优的”不一样,区别在于,提出改进,第1版甚至没有尝试。也许这就是您需要的:实际上,unix
tail
默认为最后10行(并且是可调的)。2 Andrew Jaffe os corse,但我只需要最后一行也许这就是你需要的:实际上,unix
tail
默认为最后10行(并且是可调整的)。2 Andrew Jaffe os corse,但我只需要最后一行这是唯一正确的pythonic tail方法,我已经找到了100多个答案,都涉及到子进程或整个文件的循环。这个问题是先加载一个包含数千行的日志文件,然后再循环最后100行似乎效率低下,这是唯一正确的pythonic tail方法,我发现了100多个答案,都涉及子进程或整个文件的循环。这个问题是先加载数千行的日志文件,然后再循环最后100行似乎效率低下,