统计文件中的行数

#!/bin/env python
from timeit import Timer
def timeKeeper(func,num=100):
    t = Timer(func.__name__+"()","from __main__ import "+func.__name__) 
    thetime = t.timeit(num)
    return func.__name__,thetime

def linecount1():   
    length= len(open('ABBREV.txt','rU').readlines())   #1
    return length

def linecount2():
    count=-1
    for count,line in enumerate(open('ABBREV.txt')):
        pass
    return count+1   #2

def linecount3():
    count =0
    thefile=open('ABBREV.txt','rU')
    while True:
        buffer = thefile.read(65536)
        if not buffer:break
        count+=buffer.count('\n')
    return count


for f in linecount1,linecount2,linecount3:
    print f.__name__,f()

for f in linecount1,linecount2,linecount3:
    print "%s:%.2f"%timeKeeper(f)

原文件大小1993KB 

 

运行结果 写道
linecount1 7907
linecount2 7907
linecount3 7907
linecount1:1.19
linecount2:1.14
linecount3:0.77
 

 

写这段代码总结:

 

1、三种方式速度上差别不是很明显,如果文件超大,第一种方式linecouont1可能会很慢,因为程序会一次性把文件读入内存,如果内存太小可能还会报错。第二种速度稍快,适合于大文件。第三种方式一次读取固定字节,并计算其中的换行符,这种方法速度很快,因为这里统计的是字符"\n"。

 

 

2、代码注释1处如果写成:

 

len= len(open('ABBREV.txt','rU').readlines()) 
return len

 就会有异常:UnboundLocalError: local variable 'len' referenced before assignment

 

究其原因是在给变量len赋值的时候就已经调用了len函数,python解释器在此处不再把len当成函数来处理,因为用户已经把python的执行环境中的len函数用用户自定义的len给覆盖了。既然被覆盖了len,而这里在给len赋值之前,len已经被引用(len(open....)),所以报错。

 

3、代码注释2除如果写成:

 

return count+=1

 

 会报 invalid syntax,语法错误,此语法不同于Java,在Python中,赋值语句不能作为合法的表达式,赋值语句在python中没有返回值

 

参考:

python cookbook

UnboundLocalError

python 计时工具

 

作者:liuzhijun  转载请注明出处,谢谢合作

你可能感兴趣的:(文件)