我是PySpark的新手,我试图了解如何在PySpark中编写多个嵌套的for循环,我经历了一些现有问题,但没有解决我的问题。任何帮助将不胜感激
FB是一个pyspark RDD,包含200列和06行,而delay是在上一步中计算出的值的列表。 如果需要的话,我会提供。
s2=[ ['0' for col in range(100)] for row in range(100)]
for u in log_progress (range(100)):
for v in log_progress (range(100)):
energy=0.0
for h in log_progress(range(200)):
z=0.0
for l in log_progress(range(6)):
if h+delay[l][u][v] < 100:
m= int(h+delay[l][u][v])
z= z + float(str(FB.collect()[l][m]))
energy= energy+z*z
s2[u][v]=round(energy)
调试代码时,可以正确计算能量值,但是将这些值写入s2需要很长时间。我的问题是还有其他选择吗?
答案 0 :(得分:0)
嵌套的for循环的内容总共称为:
#
次,您可以提高每个计算的效率,也可以减少计算次数。我有一个想法,可以减少必须执行的计算。
以这种方式进行计算,我认为您可以更有效地处理100*100*200*6 = 12,000,000
变量。您可以只构建满足条件h
并知道if h+delay[l][u][v]< 100:
是什么的h的值,而不是遍历范围的所有200个选项(通过在{{1}之前遍历delay[l][u][v]
})我们可以定义一个特定范围的l,u,v
值,我们希望使用h
进行遍历。
看来,在许多情况下,只有少数几个h
值会影响您的解决方案,而其余的则通过for h in log_progress(range(0,int(100-delay[l][u][v])))
被忽略,因此从一开始就忽略这些选项可能会加快代码的速度。下面应该按照我的描述进行操作:
h
根据if h+delay[l][u][v]< 100:
数据的外观,这应该使您达到200倍的速度,并且绝对不会加速。