您好,我有一个巨大的值列表,我想找到所有 n 个值模式,例如 list[0:30]、list[1:31]。并对每个值与第一个值进行百分比比较,例如percentage_change(array[0],array[1])、percentage_change(array[0],array[2]),一直到模式结束。 之后,我想将所有 30 个值模式存储在一个模式数组中,以便将来与其他值进行比较。
为此,我必须构建一个函数: 对于这个函数,可以通过更改变量 numberOfEntries 将 30 个值更改为我的任何选择 对于每种模式,我计算接下来 10 个结果的平均值,并将其存储在具有相同索引的结果数组中
#end point is the end of array
#inputs (array, numberOfEntries)
#outPut(list of Patterns, list of outcomes)
y=0
condition= numberOfEntries+1
#each pattern list
pattern=[]
#list of patterns
Patterns=[]
#outcomes array
outcomes=[]
while (y<len(array)):
i=1
while(i<condition):
#this is percentage change function, I have built it inside to gain speed. Try is used because possibility of 0 division
try:
x = ((float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries])/abs(array[y-numberOfEntries]))*100.00
if x == 0.0:
x=0.000000001
except:
x= 0.00000001
i+=1
pattern.append(x)
#here is the outcomes
outcomeRange = array[y+5:y+15]
outcome.append(outcomeRange)
Patterns.append(pattern)
#clean pattern array
pattern=[]
y+=1
对一个 8559 个值的数组执行此操作,这对于我所获取的数据量来说很小,需要 229.6792。
有办法让它适应多线程或者提高这个速度吗?
编辑:
为了更好地解释,我有以下 ohlc 数据:
open high low close volume
TimeStamp
2016-08-20 15:50:00 0.003008 0.003008 0.002995 0.003000 6.351215
2016-08-20 15:55:00 0.003000 0.003008 0.003000 0.003008 6.692174
2016-08-20 16:00:00 0.003008 0.003009 0.002996 0.003001 10.813029
2016-08-20 16:05:00 0.003001 0.003000 0.002991 0.002991 4.368509
2016-08-20 16:10:00 0.002991 0.002993 0.002989 0.002990 6.662944
2016-08-20 16:15:00 0.002990 0.003015 0.002989 0.003015 8.495640
我将其提取为
array=df['close'].values
然后我将此数组应用于该函数,它将返回一个充满此类特定值集的列表的列表,
[0.26, 0.03, -0.03, -0.04, ,0.005]
这是从每行到样本开始的百分比变化,这就是我所说的模式。我可以选择有多少条目可以有模式。
希望我现在更清楚了......
最佳答案
首先,我会将 while
循环转换为 for
循环,因为 i
现在递增得更快。
for i in range(1,condition):
现在,由于 y
在内部循环中不会改变,因此您可以从以下方面优化计算:
x = ((float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries])/abs(close[y-numberOfEntries]))*100.00
至:
x = (float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries]) * z
其中 z
在 while/for
循环之前预先计算为:
z = 100.00 / abs(close[y-numberOfEntries])
为什么?
- 首先,
z
是预先计算的,因此无需计算abs
并访问close
数组 - 第二,
z
是要除的值的倒数,因此您可以乘以它。乘法比除法快得多。 - 第三:不再可能被零除,因为您不再进行除法。 Zerodiv 可以出现在循环之外的
z
上,并且必须进行相应处理(将整个 z + 循环内容包装在try/except
中并将结果设置为x = 0.00000001
当它出现时,应该是等价的)
所以你的内部循环可能是:
try:
z = 100.00 / abs(close[y-numberOfEntries])
for i in range(1,condition):
x = (float(array[y-(numberOfEntries-i)])-array[y-numberOfEntries]) * z
except ZeroDivisionError:
x = 0.00000001
pattern.append(x)
关于python - 加快 Python 循环追加速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48195845/