加速Python循环附加
您好,我有一个巨大的值列表,我想找到所有n个值的模式,如列表[0:30],列表[1:31]。对于每个值,将百分比与第一个值进行比较,如百分比变化(数组[0],数组[1]),百分比变化(数组[0],数组[2]),一直到模式结束。 在此之后,我想将所有30个值模式存储在一个模式数组中,以便将来与其他值进行比较 为此,我必须构建一个函数: 对于此函数,可以通过更改变量numberOfEntries将30个值更改为我的任何选择 对于每种模式,我计算下10个结果的平均值,并将其存储在具有相同索引的结果数组中加速Python循环附加,python,arrays,multithreading,performance,data-analysis,Python,Arrays,Multithreading,Performance,Data Analysis,您好,我有一个巨大的值列表,我想找到所有n个值的模式,如列表[0:30],列表[1:31]。对于每个值,将百分比与第一个值进行比较,如百分比变化(数组[0],数组[1]),百分比变化(数组[0],数组[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
我将此提取为
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
致:
其中,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)
多线程是一条死胡同,不要追求它。可能是多处理,但理想的方法是对循环进行矢量化。因此,我想将其标记为numpy,但看起来您只是在使用python列表(尽管说您有np数组)?实际上,此时我没有使用numpy,只是返回一个列表@roganjosh我如何使用循环的矢量化?那么问题就相当混乱了。你可以在你的系列中使用滚动窗口,将其保存在大熊猫中。您的示例应该能够代表您正在尝试做的事情,但是,据猜测,您不希望将此数据作为python列表提取。“返回列表的熊猫”,您是指熊猫系列吗?如果是这样,其行为与numpy数组非常相似
z = 100.00 / abs(close[y-numberOfEntries])
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)