What is an efficient way that I can trigger some function once the length of a list changes by a certain amount?
I have a nested list to which I add data 100 times per second, and I want to trigger a function once the length of the list increased by some value. I tried doing this with an if
statement inside a while
loop (see my_loop()
below). This works, but this seemingly simple operation takes up 100% of one of my CPU cores. It seems to me that constantly querying the size of the list is the limiting factor of the script (adding data to the list in the while
loop is not resource-intensive).
Here is what I have tried so far:
from threading import Event, Thread
import time
def add_indefinitely(list_, kill_signal):
"""
list_ : list
List to which data is added.
kill_signal : threading.Event
"""
while not kill_signal.is_set():
list_.append([1] * 32)
time.sleep(0.01) # Equivalent to 100 Hz.
def my_loop(buffer_len, kill_signal):
"""
buffer_len: int, float
Size of the data buffer in seconds. Gets converted to n_samples
by multiplying by the sampling frequency (i.e., 100).
kill_signal : threading.Event
"""
buffer_len *= 100
b0 = len(list_)
while not kill_signal.is_set():
if len(list_) - b0 > buffer_len:
b0 = len(list_)
print("Len of list_ is {}".format(b0))
list_ = []
kill_signal = Event()
buffer_len = 2 # Print something every 2 seconds.
data_thread = Thread(target=add_indefinitely, args=(list_, kill_signal))
data_thread.start()
loop_thread = Thread(target=my_loop, args=(buffer_len, kill_signal))
loop_thread.start()
def stop_all():
"""Stop appending to and querying the list.
SO users, call this function to clean up!
"""
kill_signal.set()
data_thread.join()
loop_thread.join()
Example output:
Len of list_ is 202
Len of list_ is 403
Len of list_ is 604
Len of list_ is 805
Len of list_ is 1006