跟踪python。最佳性能实现
我对编程和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[-
我编写了一个实现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版甚至没有尝试。也许这就是您需要的:实际上,unixtail
默认为最后10行(并且是可调的)。2 Andrew Jaffe os corse,但我只需要最后一行也许这就是你需要的:实际上,unixtail
默认为最后10行(并且是可调整的)。2 Andrew Jaffe os corse,但我只需要最后一行这是唯一正确的pythonic tail方法,我已经找到了100多个答案,都涉及到子进程或整个文件的循环。这个问题是先加载一个包含数千行的日志文件,然后再循环最后100行似乎效率低下,这是唯一正确的pythonic tail方法,我发现了100多个答案,都涉及子进程或整个文件的循环。这个问题是先加载数千行的日志文件,然后再循环最后100行似乎效率低下,