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)
このようにして、ファイルを1回だけループするだけでなく、一度に複数のポイントがメモリに存在することを回避できます。
EDIT File()
はイテレータを提供しています。イテレータは、ファイルから一度に1行だけを読み取り、必要に応じてループ変数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)
...次に、Pythonはリストを作成しませんが、ジェネレーター/イテレーター-ファイルが使い果たされるまで一度に1ポイントを返します。これにより、メモリ内のすべてのポイントが同時に存在することを回避できますが、繰り返すことができるのは1回だけです。
ただし、簡単にするために、追加のイテレーターの作成を中止し、イテレーターをlasfile.File()
直接使用することにしました。