#!/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
写这段代码总结:
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中没有返回值
参考:
作者:liuzhijun 转载请注明出处,谢谢合作