对于Rhino/Grasshopper,我有一个使用GyPython组件的简单脚本。目标是将每小时的天气数据(只记录了几个小时)分配到小时。如果没有测量值,则返回0。它的工作原理应该是这样的(具有类似值的示例):
hoursList = [hr1,hr2,hr3,hr4,hr5,hr6]
measuredList = [hr2,hr3,hr6]
recordList = [wData1,wData2,wData3]
finalList = []
def assignData(i,y):
for i < len(leadList):
if hoursList[i] == measuredList[y]:
finalList.append(recordList[y])
i += 1
y += 1
else:
finalList.append(0)
i += 1
assignData(i,y)
i = 0
y = 0
assignData(i,y)
哪个应该返回
^{pr2}$此案例的结果finalList
(添加了换行符以帮助可读性)
[0, 'wData1', 'wData2', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3', 'wData2', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3', 'wData1', 'wData2', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3', 'wData2', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3', 0, 0, 'wData3', 'wData3',
0, 'wData3', 'wData3']
当我试图在大数据列表(大约43000个值)上运行此代码时,它在大约7000次迭代后崩溃。我查过了sys.getrecursionlimit是2147483647。有什么办法做这个工作吗?在
分析
给你一个数字。我称之为
limit
。在注意循环是如何工作的:对于“input i”到
limit
范围内的i
的每个值,它处理一个项,递增i
(也许还有y
),并递归。因此,您在i=0
的顶层调用将生成对assignData(1, 0)
的调用(假设失败),并等待该调用完成。然后它将回到循环的顶部,使用i=1,然后继续。。。最终连续生成limit
递归调用。在该初始调用现在将在range(1,limit)中工作,生成
limit-1
调用,第一个调用将生成limit-2
调用,依此类推。每一个关卡都会产生另一个关卡。在简言之,您产生的调用比我想象的要多得多;当您增加
limit
时,总数增长得相当快。在我怀疑您的问题是
finalList
只是超出了可用内存,因为每个调用都附加了一个元素。在调查
在代码中插入基本调试语句:
所以你可以看到通话的进程。在
修复
我怀疑您是否需要这个双重嵌套的递归堆栈。事实上,我不认为递归能给你带来任何好处。看起来你只需要在列表中浏览一次,找到实际对应的时间,否则就填写0。摆脱调用,正确使用
^{pr2}$for
来控制i
的值,并根据需要缩减代码。在更好的解决方案
如果你需要的只是匹配时间的记录,你可以让它更直接。建立一个字典来索引时代的测量。在
现在,编写一个列表理解,以便在不在字典中的任何时候插入0。在
如果我没看错你的问题,那就是你的总目标。在
相关问题 更多 >
编程相关推荐