【发布时间】:2015-07-25 04:06:37
【问题描述】:
我想加快这段代码的速度:
import numpy as np
import pandas as pd
a = pd.read_csv(path)
closep = a['Clsprc']
delta = np.array(closep.diff())
upgain = np.where(delta >= 0, delta, 0)
downloss = np.where(delta <= 0, -delta, 0)
up = sum(upgain[0:14]) / 14
down = sum(downloss[0:14]) / 14
u = []
d = []
for x in np.nditer(upgain[14:]):
u1 = 13 * up + x
u.append(u1)
up = u1
for y in np.nditer(downloss[14:]):
d1 = 13 * down + y
d.append(d1)
down = d1
以下数据:
0 49.00
1 48.76
2 48.52
3 48.28
...
36785758 13.88
36785759 14.65
36785760 13.19
Name: Clsprc, Length: 36785759, dtype: float64
for 循环太慢了,我该怎么做才能加快这段代码的速度?我可以向量化整个操作吗?
【问题讨论】:
-
a['Clsprc']的大小是多少? -
以编程方式我会寻找一种方法来并行化操作,例如 NumPy 数组或其他集合数据类型的并行实现(例如可用于 Scala 集合)。有许多方法可以并行化 for 循环,例如参见 pythonhosted.org/joblib/parallel.html。 Anaconda 有一个 MKL 优化包,专门用于提高 NumPy、SciPy、scikit-learn 和 NumExpr 的性能,请参阅store.continuum.io/cshop/mkl-optimizations,但它不是免费的。
-
那真的是正确的代码吗?这些乘以 13 的乘法对我来说看起来很奇怪——你的值很快就会消失。我认为您正在尝试计算滚动平均值并且忘记了除法,但是由于您的代码没有记录,因此您没有解释您要做什么,而且您的实现似乎很奇怪,很难确定。