如何使这个for循环更快?

2024-05-29 09:47:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道python循环本身与其他语言相比相对较慢,但是当使用正确的函数时,它们会变得更快。 我有一个名为“声学”的熊猫数据帧,它包含超过1000万行:

print(acoustics)
                        timestamp            c0  rowIndex
0        2016-01-01T00:00:12.000Z  13931.500000   8158791
1        2016-01-01T00:00:30.000Z  14084.099609   8158792
2        2016-01-01T00:00:48.000Z  13603.400391   8158793
3        2016-01-01T00:01:06.000Z  13977.299805   8158794
4        2016-01-01T00:01:24.000Z  13611.000000   8158795
5        2016-01-01T00:02:18.000Z  13695.000000   8158796
6        2016-01-01T00:02:36.000Z  13809.400391   8158797
7        2016-01-01T00:02:54.000Z  13756.000000   8158798

我写的代码是:

^{pr2}$

它需要大量的时间,我怎样才能使它更快?在


Tags: 数据函数代码语言时间timestampprint声学
3条回答

数据帧有一个很好的方法rolling来构造和应用窗口转换;因此,您根本不需要循环:

# df is your data frame
window_size = 5
weights = pd.np.array([1/9, 1/18, 1/27, 1/36, 1/54])
weights /= weights.sum()
df.loc[:,'deltaAc'] = df.loc[:, 'c0'].rolling(window_size).apply(lambda x: ((x[-1] - x)*weights).sum())

第一个优化,weights[c]/sumWeights可以在循环之外完成。在

weights_array = np.array([1/9, 1/18, 1/27, 1/36, 1/54])
sumWeights = np.sum(weights_array)
tmp = weights_array / sumWeights
...
        sum += tmp[c]*...

我对pandas不熟悉,但如果您可以将列提取为1D numpy数组,那将对您非常有用。它可能看起来像:

^{pr2}$

您可以使用pandas中的^{}并为数组中的每一行创建所有差异,然后与您的weigths相乘,最后在轴1上sum,例如:

deltaAc = pd.DataFrame({'timestamp': acoustics.loc[5:, 'timestamp'], 
                       'summation': (np.array([acoustics.c0.diff(i) for i in range(5) ]).T[5:]
                                               *np.array(weights)).sum(1)/sumWeights})

你得到的值和我用你的代码得到的值一样:

^{pr2}$

相关问题 更多 >

    热门问题