只是为了好玩,我写了一堆函数,在一个文件上迭代,并把每一行放到一个列表中。
#!/usr/bin/python
def readlines():
with open("sorted_output.txt") as f:
line = f.readlines()
def readline():
with open("sorted_output.txt") as f:
line = f.readline()
lines = []
while line:
lines.append(line)
line = f.readline()
def iterate():
with open("sorted_output.txt") as f:
lines = []
for line in f:
lines.append(line)
def comprehension():
with open("sorted_output.txt") as f:
lines = [line for line in f]
下面是它们各自在一个有69,073行的文件上的表现,使用Python 2.6(注意,这些结果在较新版本的Python上可能有所不同)。
dano@hostname:~> python -mtimeit -s 'import test' 'test.readline()'
10 loops, best of 3: 78.3 msec per loop
dano@hostname:~> python -mtimeit -s 'import test' 'test.readlines()'
10 loops, best of 3: 21.6 msec per loop
dano@hostname:~> python -mtimeit -s 'import test' 'test.comprehension()'
10 loops, best of 3: 23.6 msec per loop
dano@hostname:~> python -mtimeit -s 'import test' 'test.iterate()'
10 loops, best of 3: 33.3 msec per loop
所以,readlines()在这里是最快的,尽管使用列表理解对每一行进行迭代几乎与之匹配。我的猜测是,每种方法的速度差异主要是Python中函数调用的高开销造成的(需要的函数调用越多,方法越慢),但也可能有其他因素。希望比我更有见识的人能够对此发表意见。
除了性能之外,在决定使用哪种方法时,还有一个重要的考虑因素是内存成本。使用readlines()会一次将整个文件读入内存。如果你正在处理一个巨大的文件,如果你试图一次性将整个文件读入内存,可能会导致严重的性能问题,或者使程序完全崩溃。在这种情况下,你会想使用iterate()的方法,因为它一次只读一行到内存。如果你只是对每一行进行某种处理,然后把它扔掉,这通常是个好办法,即使它比readlines()稍慢一些,因为你不会受到同样的内存冲击。当然,如果你最终的目标是将整个文件存储在一个 Python 列表中,那么无论如何你都要付出内存的代价,所以 readlines() 会工作得很好。