加速Python循环追加

时间:2018-01-10 20:50:03

标签: python arrays multithreading performance data-analysis

你好我有一个庞大的值列表,我想找到所有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]

这是从每一行到示例开头的百分比变化,这就是我所说的模式。我可以选择条目可以有多少模式。

希望我现在更清楚......

1 个答案:

答案 0 :(得分:2)

首先,我会将def view_images(request): return render_to_response('gallery/index.html',{ 'categories': Category.objects.all(), 'images': Image.objects.all(), 'video': Video.objects.all() }) 循环转换为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 在<{em> z循环之前预先计算

while/for

为什么?

  • 首先,预先计算 z = 100.00 / abs(close[y-numberOfEntries]) ,因此不计算z并访问abs数组
  • 第二,close是要除的值的倒数,所以你可以乘以它。乘法比分裂更快。
  • 第三:因为你不再分裂,所以不能再除零。 zerodiv可以在循环外的z上发生,并且必须相应地处理(在z中包裹整个z +循环事物并在结果发生时将结果设置为try/except,它应该是当量)

所以你的内循环可能是:

x= 0.00000001