One thing to remember about ProcessPoolExecutor is that parameters and return values are pickled (serialized/deserialized) in order to communicate with other Python processes. Subinterpreters (PEP 554) aims to alleviate this.
https://www.python.org/dev/peps/pep-0554/