Usually a remote method invocation results in serialization of the arguments into a message that is sent to a remote process. For many situations, Charm4py relies on Python’s pickle module.


Pickling is bypassed for certain data types that implement the buffer protocol (byte arrays, array.array and NumPy arrays) and is encouraged for best performance. For these, the data is directly copied from its memory buffer in Python into a message in the Charm C++ library for sending. The Performance Tips section explains how to take advantage of this.

Pickling can account for much of the overhead of the Charm4py runtime. Fastest pickling is obtained with the C implementation of the pickle module (only available in CPython). A general guideline to achieve good pickle performance is to avoid passing custom types as arguments to remote methods in the application’s critical path. Examples of recommended types to use for best performance include: Python containers (lists, dicts, set), basic datatypes (int, float, str, bytes) or combinations of the above (e.g.: dict containing lists of ints). Custom objects are automatically pickled but can significantly affect the performance of pickle and therefore their use inside the critical path is not recommended.