我正在尝试遍历一个文件,其中有数百万行包含一些数据,而我正在检索它。不幸的是,这种情况非常缓慢,我想知道如何才能提高效率。 目前我正在加载两个文件,我按每行迭代。
代码:
# Retrieve session data
UBList = array([line.split('\t') for line in source])
SID = set(UBList[:,1])
n_unique_sessions = len(Counter(UBList[:,1]))
source.close()
sessions = {}
session_info = {}
purchases = array([line.split('\t') for line in open('Data/order_overview.txt', 'r').readlines()])
for sid in SID:
print sid
s = [line for line in UBList if line[1]==sid]
uline = [line for line in s if line[3]=='17']
tline = [line[2] for line in s]
t_format = "%Y-%m-%d %H:%M:%S.%f"
s_start = datetime.strptime(tline[0], t_format)
s_end = datetime.strptime(tline[-1], t_format)
s_length = (s_end - s_start).total_seconds()
d_time = [line[2] for line in s if line[3]=='4']
if len(uline) > 0:
uid = uline[0][12]
else:
uid = 'NotFound'
num_queries = len([line for line in s if line[3]=='27'])
num_purchases = nonzero(purchases[:,0]==sid)[0].shape[0]
sessions.update({sid: (uid, num_queries, num_purchases, s)})
f = open('Results/' + sid + '_' + uid + '_' + str(num_queries) + '_' + str(num_purchases) + '_' + str(s_length) + '.txt', 'w')
f.writelines(['\t'.join(line) for line in s])
f.close()
这样的事情会加速吗?
somevar = dict([sid, [] for sid in SID])
for line in UBList:
sid = line[1]
dSID[sid].append('\t'.join(line))
也可以在达到某个标准后获得下一行吗?例如,我发现一行用下一行得到它的值并进行计算。如果多次找到符合条件的行,则添加结果。
答案 0 :(得分:0)
如果source
是您的文件对象,请不要事先将其全部读取到内存中。您可以同时处理它并读取,并且Python足够聪明地处理数据,同时等待下一个块被读取。要实现这一点,请使用列表生成器,而不是列表推导。
您创建了许多实际上并不需要的数组,例如s
。用发电机替换它们并获得加速。创建标准Python数组是一项繁重的操作,如果它大于4kB,则生成器应该更好。