增加了for循环的计算速度



我需要为表示三维网络节点的列表中的项目计算一些值。该列表显示了节点的x、y和z坐标以及值。我试图通过将位于节点下方的节点求和来计算节点的位置值。(就像计算块的金字塔(

  • rl_alternatives是max(z(
  • 列表由[3,4,2,55]类值组成

对于网络中的项目:

pw=0
for level in range(1,rl_alternatives):
for i in range(len(network)):
if network[i][2]==item[2]-level:
if network[i][0]>=item[0]-level and network[i][0]<=item[0]+level:
if network[i][1]<=item[1]+level and network[i][1]>=item[1]-level:
pw+=(network[i][3])         
item.append(pw)

我正在将其用于循环,并尝试对其进行Cynthoning,通过pool((选项对其进行多处理。因为循环本身是工作的,但当网络越来越大时,计算时间越来越长,变得不合理。Cynthoning的时间减少了近%10,但这还不够。OTOH多处理使其持续时间更长。

我是否可以在计算时间方面改进我的循环?如果有人给我一些想法,我会很高兴。提前谢谢。

您可以在循环的上游预先计算item[0]-levelitem[0]+level,因为它们对于某个level是恒定的。

仅按照建议提高可读性:

pw = 0
for level in range(1, rl_alternatives):
for node in network:
if node[2] == item[2]-level:
if node[0] >= item[0]-level and node[0]<=item[0]+level:
if node[1]<=item[1]+level and node[1]>=item[1]-level:
pw+=node[3]

通过预先计算,这变成了:

pw = 0
for level in range(1, rl_alternatives):
limit_low = item[0]-level
limit_high = item[0]+level
for node in network:
if node[2] == item[2]-level:
if node[0] >= limit_low and node[0] <= limit_high: # condition 1
if node[1]<=item[1]+level and node[1]>=item[1]-level: # could be improved the same way
pw+=node[3]

我尝试了一个带有timeit的简化循环。根据你需要通过条件1的次数,它给了我5-15%的提升(每个循环通过条件7-11次(。希望这对你有用。

最新更新