More efficient alternative to while/for loop for periodic action?

Hello!

I have a script (copied below) that records the mean and standard deviation of intensity values in a particular visible segment. I want to use this to periodically check the intensity values in the segmented region of a 2D ultrasound image, which is streamed live through the PLUS server using OpenIGTLink.

Currently, the script I have does the task, but each iteration of the script takes >150ms to run while the PLUS server is running. Because of this, the refresh rate of the GUI and the ultrasound image drops down to 5-6 times per second. This is a much slower frame rate than I want. Is there a more efficient way of monitoring intensity values in a segment of a live ultrasound image?

Thanks!

# measuring average voxel intensity and standard deviation

import time
import numpy
# inputs
volumeNode = getNode('Image_Image')
segmentationNode = slicer.mrmlScene.GetFirstNodeByClass("vtkMRMLSegmentationNode")

# get voxels of visible segments as numpy arrays
visibleSegmentIds = vtk.vtkStringArray()
segmentationNode.GetDisplayNode().GetVisibleSegmentIDs(visibleSegmentIds)

#timestamp
import datetime
ct = datetime.datetime.now()
print('current time:', ct)

#while live image is displayed, collect mean and sd
meanArray = [];
sdArray = [];

for i in range(100): #for loop for testing purposes
    for segmentIdIndex in range(visibleSegmentIds.GetNumberOfValues()):
        segmentId = visibleSegmentIds.GetValue(segmentIdIndex)
        segmentName = segmentationNode.GetSegmentation().GetSegment(segmentId).GetName()
        if 'Target' in segmentName: #workshop this
            segmentArray = slicer.util.arrayFromSegmentBinaryLabelmap(segmentationNode, segmentId, volumeNode)
            volumeArray = slicer.util.arrayFromVolume(volumeNode)
            volumeVoxelsInSegmentArray = volumeArray[segmentArray > 0]
            contourMean = volumeVoxelsInSegmentArray.mean()
            contourSD = volumeVoxelsInSegmentArray.std()
            meanArray.append(contourMean)
            sdArray.append(contourSD)

            if i > 0 and (meanArray[i] > meanArray[i-1]+sdArray[i-1] or meanArray[i] < meanArray[i-1]-sdArray[i-1]):
                print('Values in contour have changed and subject may have moved!')

    slicer.app.processEvents()