加速Python循环附加

加速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个结果的平均值,并将其存储在具有相同索引的结果数组

您好,我有一个巨大的值列表,我想找到所有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)