我有一个脚本,如果它具有某种模式,则删除第二行。但是,当在包含数百个文件的文件夹上运行它很慢时,我必须等待5分钟左右才能完成。因为它是i / o我确定有一种方法可以加速或并行化它你知道怎么做?这是当前的慢代码:
import datetime as dt
import os, re
for symb in os.listdir(r'C:\folder'):
n1=dt.datetime.now()
fh, abs_path = mkstemp()
new_file = open(abs_path,'w')
file_path = r'C:\folder' + '\\' + symb
print(repr(file_path))
old_file = open(file_path, 'r')
new_file = open(abs_path, 'w')
data = old_file.readlines()
if re.match('9:', data[1]):
print('YES')
del data[1]
for line in data :
new_file.write(line)
new_file.close()
close(fh)
old_file.close()
remove(file_path)
move(abs_path, file_path)
print(symb + ' : ' + str((dt.datetime.now()-n1).microseconds))
答案 0 :(得分:1)
您可能是磁盘绑定的,但是您可以通过执行更大的块复制来稍微收紧代码。而不是readlines / writelines,手动处理前两行,然后将其转换为shutil用于其余部分。
import shutil
....
line1 = oldfile.readline()
line2 = oldfile.readline()
if re.match('9:', line2):
line2 = ''
newfile.write(line1 + line2)
shutil.copyfileobj(old_file, new_file, length=1024*1024)
您可以通过对所有文件执行xcopy并查看时间是否相同来查看是否受磁盘限制。如果您有多个硬盘驱动器,则应确保中间文件位于同一驱动器上。
答案 1 :(得分:0)
查看multiprocessing
模块。例如,您可以使用Pool
并行地在文件列表上映射函数:
from multiprocessing import Pool
p = Pool(5)
def doIt(x):
# do the thing
p.map(doIt, os.listdir(r'C:\folder'))