def compile_multi_part(self, io_specs):
    """Compile multiple functions for partial execution. Each function would
    only execute the oprs necessary to compute current outspec, and intermediate
    results from previous functions are reused. The functions would share
    underlying device storage with this graph.

    .. warning::

        Each individual partial function would have a newly created computing
        graph. Therefore plugins attached on this graph would not be effective
        on the partial functions.

    :param io_specs: input/output specifications as a list of
        ``(inputs, outspec)`` pairs. Each pair is defined as the params of
        :meth:`compile`.
    :return: a list of :class:`.AsyncExec` objects as the functions
        corresponding to each part
    """
    self._clear_output_spec()
    updaters = []
    for inputs, outspec in io_specs:
        updaters.append(self._process_output_spec(inputs, outspec))
        self._add_multi_part_endpoint()
    funcs = self._do_compile_multi_part()
    for i, j in zip(funcs, updaters):
        j(i)
    return funcs