高效读取30万新闻
算法思路:
·构建生成器类算法
·构建迭代器类算法
·高效读取30万新闻
·读取30万新闻算法性能对比
import os,time
# 迭代器类
class loadFolders(object):
def __init__(self,par_path):
self.par_path = par_path
def __iter__(self):
for file in os.listdir(self.par_path):
file_abspath = os.path.join(self.par_path,file)
if os.path.isdir(file_abspath):
yield file_abspath #return
class loadFiles(object):
def __init__(self,par_path):
self.par_path = par_path
def __iter__(self):
folders = loadFolders(self.par_path)
for folder in folders:
catg = folder.split(os.sep)[-1]
for file in os.listdir(folder):
yield catg,file
if __name__=='__main__':
filepath = os.path.abspath(r'../dataSet/CSCMNews/')
files = loadFiles(filepath)
for i,msg in enumerate(files):
if i%10000==0:
print('{t}***{i} \t docs has been read'.format(i=i,t=time.strftime('%Y-%m-%d %H:%M:%S',time,localtime())))
end = time.time()
print('Total spent times:%.2f' % (end - start))
生成器小结:
·数组、链表、字符串、文件等缺点就是所有的数据都在内存里,海量的数据耗内存。
·生成器是可以迭代的,工作原理就是重复调用next()方法,直到捕获一个异常。
·有yield的函数不再是一个普通的函数,而是一个生成器generator,可用于迭代。
·yield是一个类似return的关键字。
yield生成器