Gia*_*ear 3 python performance memory-management coding-style
我有一组点(x和y),我想知道X和Y的最大值和最小值(边界框).我编码这些行,我用列表理解读取所有点,然后在X和Y上使用max和min.最后我删除了点.
这个解决方案不是内存效率,因为我需要读取所有点
points = [(p.x,p.y) for p in lasfile.File(inFile,None,'r')] # read in list comprehension
X_Max = max(zip(*points)[0])
X_Min = min(zip(*points)[0])
Y_Max = max(zip(*points)[1])
Y_Min = min(zip(*points)[1])
del points
Run Code Online (Sandbox Code Playgroud)
我要求建议避免这一步骤(将所有点存储在内存中).在此先感谢Gianni
X_Max = float('-inf')
X_Min = float('+inf')
Y_Max = float('-inf')
Y_Min = float('+inf')
for p in lasfile.File(inFile,None,'r'):
X_Max = max(X_Max, p.x)
X_Min = min(X_Min, p.x)
Y_Max = max(Y_Max, p.y)
Y_Min = min(Y_Min, p.y)
Run Code Online (Sandbox Code Playgroud)
这样,您只需在文件上循环一次,并避免一次在内存中有多个点.
EDIT File()提供了一个迭代器,它只从文件中一次读取一行并在需要时将其提供给循环变量p.
在您的问题中,您在初始点分配周围使用了方括号.这是一个列表理解,顾名思义,它创建一个列表 - 所以所有点都从该点开始保存在内存中.如果您使用括号而不是这样:
points = ((p.x,p.y) for p in lasfile.File(inFile,None,'r'))
X_Max = float('-inf')
X_Min = float('+inf')
Y_Max = float('-inf')
Y_Min = float('+inf')
for p in points:
X_Max = max(X_Max, p.x)
X_Min = min(X_Min, p.x)
Y_Max = max(Y_Max, p.y)
Y_Min = min(Y_Min, p.y)
Run Code Online (Sandbox Code Playgroud)
...然后Python不会创建一个列表,而是一个生成器/迭代器 - 它会一次返回一个点,直到文件耗尽.这样可以避免同时在内存中占用所有点 - 但只能迭代一次.
但是为了简单起见,我已经放弃了另外一个迭代器的创建,而只是lasfile.File()直接使用它.
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |