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