I have a Python code adding information to a layer if its features are overlayed by other features. The base layer has 1200 features and is 10 MB. The 4 layers for the overlay have roughly 40 MB combined.
When I run the script, it takes more than 10 hours to calculate the results. This seems odd and long. I have a Ryzen 2700X and 16GB of RAM.
Is there anything off about my code which could explain the long computing time? What steps could I do to optimize this?
import time
start_time = time.time()
project = QgsProject().instance()
listOverlays = ['Overlay1', 'Overlay2', 'Overlay3', 'Overlay4']
mainLayer = project.mapLayersByName('Baselayer')[0]
provider = mainLayer.dataProvider()
mainLayer_names = [field.name() for field in mainLayer.fields()]
listOverlaysLayers = [project.mapLayersByName(layerName)[0] for layerName in listOverlays]
# add the necessary fields to mainLayer
for name in listOverlays:
if name not in mainLayer_names :
provider.addAttributes([QgsField(name, QVariant.String)])
mainLayer.updateFields()
#main Layer feats list After Adding the new fields
mainLayer_features = [ftr for ftr in mainLayer.getFeatures()]
mainLayer.startEditing()
for feature in mainLayer_features :
print('Feature '+ str(feature.id()))
for layer in listOverlaysLayers :
print('......Layer '+ str(layer.name()))
layer_temp = QgsVectorLayer(f"{'Polygon'}?crs={str(mainLayer.crs().authid()).lower()}", "temp", "memory")
pr = layer_temp.dataProvider()
pr.addFeatures([feature])
param = { 'INPUT' : layer, 'INTERSECT' : layer_temp, 'METHOD' : 0, 'PREDICATE' : [0] }
processing.run('native:selectbylocation', param)
if layer.selectedFeatureCount() == 0 :
feature[str(layer.name())]='no'
mainLayer.updateFeature(feature)
else :
feature[str(layer.name())]='yes'
mainLayer.updateFeature(feature)
del layer_temp
del pr
del param
mainLayer.commitChanges()
end_time = time.time()
duration = end_time - start_time
print(f"\nDuration: {duration} seconds")