我正在处理大尺寸的.csv
个文件(每个300MB
左右)。每个文件对应一个模拟场景,我必须对其进行一些统计。这是我对待他们的方式:
ia = [[[0 for col in range(500)] for row in range(len(xv)) for x in range(len(bite)) ] for y in range(len(gamma))]
ra = [[[0 for col in range(500)] for row in range(len(xv)) for x in range(len(bite)) ] for y in range(len(gamma))]
ic = [[[0 for col in range(500)] for row in range(len(xv)) for x in range(len(bite)) ] for y in range(len(gamma))]
rc = [[[0 for col in range(500)] for row in range(len(xv)) for x in range(len(bite)) ] for y in range(len(gamma))]
stat = 50
for i in range(0,len(xv)):
for j in range(0,len(bite)):
for k in range(0,len(gamma)):
folder = '/data_%.4f_%.1f_%.1f_%.1f_%f,%.2f/'%(xv[i],R0, mu, tau, bite[j],gamma[k]);
Ia = [] ##
Ra = [] ##
Ic = [] ##
Rc = [] ##
for s in range(0,stat):
f = path+folder+'run_%d.csv'%s
df = pd.read_csv(f, names=['t', 'id', 'S','E','I','R','Sm','Em','Im'],header=0)
df0 = df.groupby(df.t).sum()
Ia.append(df0.I)
Ra.append(df0.R)
df0 = df.groupby(df.t).apply(lambda column: (column != 0).sum())
df0=df0.fillna(0)
Ic.append(df0.I)
Rc.append(df0.R)
Ia = pd.DataFrame(Ia)
Ra = pd.DataFrame(Ra)
Ic = pd.DataFrame(Ic)
Rc = pd.DataFrame(Rc)
ia[i][j][k] = np.median(Ia)
ra[i][j][k] = np.median(Ra)
ic[i][j][k] = np.median(Ic)
rc[i][j][k] = np.median(Rc)
然而,这个过程非常缓慢,我想知道是否有最快的解决方案来阅读它们。
答案 0 :(得分:0)
可能会有所帮助的两件事:
对于这些行
ia = [[[0 for col in range(500)] for row in range(len(xv)) for x in range(len(bite)) ] for y in range(len(gamma))]
因为您只是创建一个多维的零列表,所以您可以:
ia = [[[[0] * 500] * (len(xv) * len(bite))]] * len(gamma)
而不是必须多次调用范围。
有关
for i in range(0,len(xv)):
for j in range(0,len(bite)):
for k in range(0,len(gamma)):
和for s in range(0,stat):
使用xrange
代替range
。
此外,如果可能,将ia,ra,ic和rc更改为单个分层dict而不是嵌套,这样您就可以使用元组作为键而不是访问嵌套的dicts:
ia[(i, j, k)] # as apposed to ia[i][j][k]
在设置dict的值时,您可能不会对此有所了解,但在以这种方式访问dict时,您可能会看到更好的性能。