Python:如何提高脚本的性能以获得一组点的边界框

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

Ste*_*yne 5

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()直接使用它.

  • 它是一个生成器,所以它在内存中一次只能有一个点.注意第一行周围的括号而不是方括号. (2认同)