Arrays 算法的Python循环优化

Arrays 算法的Python循环优化,arrays,python-3.x,performance,for-loop,data-structures,Arrays,Python 3.x,Performance,For Loop,Data Structures,大家好,我正在研究一个算法,它包含一些复杂的函数,简化了一些东西,并粘贴在下面,因为我需要完成多次迭代。有下面的解释和代码示例,它是用for循环完成的,速度非常慢,因为我的实际数据有非常大的数组和递归 寻找更好的方法更快地完成这部分。什么样的结构更快,什么样的结构更像是一种“pythonic”方法。请帮忙 必须打开此阵列: Arr=[21,20,19,18,17,16,15,0,0,0,0,0] 为此: [21,20,19.3,18.3,17.3,16.3,15.3,0,0,0,0,0] 根据算

大家好,我正在研究一个算法,它包含一些复杂的函数,简化了一些东西,并粘贴在下面,因为我需要完成多次迭代。有下面的解释和代码示例,它是用for循环完成的,速度非常慢,因为我的实际数据有非常大的数组和递归

寻找更好的方法更快地完成这部分。什么样的结构更快,什么样的结构更像是一种“pythonic”方法。请帮忙

必须打开此阵列:

Arr=[21,20,19,18,17,16,15,0,0,0,0,0]

为此:

[21,20,19.3,18.3,17.3,16.3,15.3,0,0,0,0,0]

根据算法中的以下5个步骤:

1.找到第一个非零项并将其索引

2.发现接近“终端值”且条件大于a

3.在这种情况下,使用>17作为该条件的代理

4.找到实际的“终端值”,它需要一个测试条件(在这种情况下,使用奇数作为该条件的代理) -如果通过:它是k处的实际“终端值” -如果失败,则“终端值”位于其前面的k-1中

5.然后将数组的值替换为数组中值的加权(70/30)平均值,从索引到“终值”k,必须在替换前计算平均值,以免干扰下一次平均值计算

编辑:有人要求进行演练- 步骤1:第一个非零是15,索引为6 步骤2/3:靠近终端查找>17,即索引为3的18。注:在实际数据集中,我只知道我的终值是测试中的终值还是下一个终值。这就是接下来要执行的操作。 步骤4:检查18是否为奇数->Falis so必须是下一个。所以终值是19,指数是2。 步骤5:现在我计算原始数组在第一个非零元素和终端值之间的加权平均值,而不是递归,并保持数组的大小不变。索引6(第一个非零)值15替换为0.715+0.316=15.3,索引5值16替换为0.716+0.317=16.3,索引4值17替换为0.717+0.318=17.3,索引3值18替换为0.718+0.319=18.3,索引2(终端)值15替换为0.719+0.320=19.3。结束

n=12
Arr=[21,20,19,18,17,16,15,0,0,0,0,0,0]    

   

#find first non-zero and index it
for i in range(n,-1,-1):
    if Arr[i]>0:
        Index=i
        break    

#find close to "terminal value" with a greater than a condition. 
#In this case used >17 as proxy for that condition
for i in range(Index,-1,-1):     
    if Arr[i]>17:
        Close=i
        break

#Find the actual "terminal value", which requires one test condition 
#if it passes: It is the actual "terminal value" at k
#if it fails then "terminal value" is in the one preceeding it k-1
#In this case used Odd as a proxy for that condition
#Then replace the the values of the array by the weighted (70/30) average of values from the array
#from the Index until the "terminal value" k
#must calculate average before replacing
        
if Arr[Close] %2 != 0 :
    k=Close 
else: 
    k= Close -1

for i in range(Index,k-1,-1):
   Arr[i]=.7*Arr[i]+.3*Arr[i-1]

我不明白这五个步骤??为什么你在一些数字上加.3,而在其他数字上不加?你想做什么?在第一步中,它意味着什么?在步骤2/3中,接近终值意味着什么?在步骤4中,“查找终值”是什么意思?在第五步中,你所说的加权平均70/30是什么意思?另外,在哪个数组中替换值。从指数到终值是什么意思?你能浏览一下你的例子并展示每个步骤的操作吗?如果元素像例子中那样被排序,你可以通过二进制搜索找到前两个位置。您仍然可以根据条件调整一个,但这是恒定的时间。然后您就有了查找索引的日志运行时间和更新的线性时间。当然,对于更新,你不能更快,但可能有更快的搜索解决方案,这取决于数据。Itproh66->Instep 1:Index它意味着第一个非零元素的索引。Itproh66->在我更复杂的rel world问题的步骤2/3中,我的终值将是计算的结果,根据一项测试,将是这一个,或下一个。离终端很近的可能就是终端,测试让我知道我是需要那个还是下一个。Itproh66->在步骤5中,加权平均值(70/30)仅为0.7*Val[i]+>0.3 Val[i+1];当然,在我的现实世界中,它更复杂。Itproh66->“替换”是指对第一个非零元素和终端值之间的所有值执行类似加权平均的计算。