ThreadPoolExecutor is the problem as access to the identical objects is locked by the GIL.
Substituting with ProcessPoolExecutor unlocks the situation. Speedup is obtained albeit at the cost of memory overhead linked to passing max_workers times the dataset.