如何减少在Python中读取.csv的计算时间?

时间:2016-02-19 16:08:00

标签: python csv

我正在处理大尺寸的.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)

然而,这个过程非常缓慢,我想知道是否有最快的解决方案来阅读它们。

1 个答案:

答案 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时,您可能会看到更好的性能。