【发布时间】:2011-04-21 15:02:09
【问题描述】:
我从我的系统中读取了许多文件。我想更快地阅读它们,可能是这样的:
results=[]
for file in open("filenames.txt").readlines():
results.append(open(file,"r").read())
我不想使用线程。任何建议表示赞赏。
我不想使用线程的原因是因为它会使我的代码不可读,我想找到一种棘手的方法来提高速度,减少代码,更容易理解
昨天我测试了另一种多处理解决方案,效果不好,我不知道为什么, 代码如下:
def xml2db(file):
s=pq(open(file,"r").read())
dict={}
for field in g_fields:
dict[field]=s("field[@name='%s']"%field).text()
p=Product()
for k,v in dict.iteritems():
if v is None or v.strip()=="":
pass
else:
if hasattr(p,k):
setattr(p,k,v)
session.commit()
@cost_time
@statistics_db
def batch_xml2db():
from multiprocessing import Pool,Queue
p=Pool(5)
#q=Queue()
files=glob.glob(g_filter)
#for file in files:
# q.put(file)
def P():
while q.qsize()<>0:
xml2db(q.get())
p.map(xml2db,files)
p.join()
【问题讨论】:
-
所以你想在不使用线程的情况下比平时更快地阅读它?任何程序每个线程一次只能做一件事。
-
@dutt:实际上,可以通过使用 Windows 中的重叠 I/O 和 Linux 中的 AIO(我认为支持不佳)等机制来更快地让操作系统重新排序读取以匹配磁盘布局和减少寻道。不过,我严重怀疑他是否真的想这样做。它要复杂得多,而且不会总是有很大的不同。
-
重叠的 i/o...整洁。你每天都会学到一些东西。
-
@dutt 我不想使用线程的原因是因为它会使我的代码不可读,我想找到如此棘手的方法来提高速度和减少代码,更容易理解
-
你的意思是“我不想使用线程的原因是因为它会使我的代码不可读,我想找到一些棘手的方法来制作程序更快,代码行更少,并且更容易理解”?目前,这句话在结尾处分崩离析。 WRT 线程代码不可读 - 这是有争议的。有一些高级构造使线程代码非常易读,还有一些用于传统线程 API 的简单组织技术。
标签: python performance file concurrency io