Ejemplo n.º 1
0
    def __init__(self, total_or_items, ipython_widget=False, file=None):
        """
        Parameters
        ----------
        total_or_items : int or sequence
            If an int, the number of increments in the process being
            tracked.  If a sequence, the items to iterate over.

        ipython_widget : bool, optional
            If `True`, the progress bar will display as an IPython
            notebook widget.

        file : writable file-like object, optional
            The file to write the progress bar to.  Defaults to
            `sys.stdout`.  If `file` is not a tty (as determined by
            calling its `isatty` member, if any, or special case hacks
            to detect the IPython console), the progress bar will be
            completely silent.
        """

        ipython_widget = False

        # if ipython_widget:
        #     # Import only if ipython_widget, i.e., widget in IPython
        #     # notebook
        #     if ipython_major_version < 4:
        #         from IPython.html import widgets
        #     else:
        #         from ipywidgets import widgets
        #     from IPython.display import display

        if file is None:
            file = _get_stdout()

        if not isatty(file) and not ipython_widget:
            self.update = self._silent_update
            self._silent = True
        else:
            self._silent = False

        if isiterable(total_or_items):
            self._items = iter(total_or_items)
            self._total = len(total_or_items)
        else:
            try:
                self._total = int(total_or_items)
            except TypeError:
                raise TypeError("First argument must be int or sequence")
            else:
                self._items = iter(range(self._total))

        self._file = file
        self._start_time = time.time()
        self._human_total = human_file_size(self._total)
        self._ipython_widget = ipython_widget

        self._signal_set = False
        if not ipython_widget:
            self._should_handle_resize = (
                _CAN_RESIZE_TERMINAL and self._file.isatty())
            self._handle_resize()
            if self._should_handle_resize:
                signal.signal(signal.SIGWINCH, self._handle_resize)
                self._signal_set = True

        self.update(0)
Ejemplo n.º 2
0
    def __init__(self, total_or_items, ipython_widget=False, file=None):
        """
        Parameters
        ----------
        total_or_items : int or sequence
            If an int, the number of increments in the process being
            tracked.  If a sequence, the items to iterate over.

        ipython_widget : bool, optional
            If `True`, the progress bar will display as an IPython
            notebook widget.

        file : writable file-like object, optional
            The file to write the progress bar to.  Defaults to
            `sys.stdout`.  If `file` is not a tty (as determined by
            calling its `isatty` member, if any, or special case hacks
            to detect the IPython console), the progress bar will be
            completely silent.
        """

        ipython_widget = False

        # if ipython_widget:
        #     # Import only if ipython_widget, i.e., widget in IPython
        #     # notebook
        #     if ipython_major_version < 4:
        #         from IPython.html import widgets
        #     else:
        #         from ipywidgets import widgets
        #     from IPython.display import display

        if file is None:
            file = _get_stdout()

        if not isatty(file) and not ipython_widget:
            self.update = self._silent_update
            self._silent = True
        else:
            self._silent = False

        if isiterable(total_or_items):
            self._items = iter(total_or_items)
            self._total = len(total_or_items)
        else:
            try:
                self._total = int(total_or_items)
            except TypeError:
                raise TypeError("First argument must be int or sequence")
            else:
                self._items = iter(range(self._total))

        self._file = file
        self._start_time = time.time()
        self._human_total = human_file_size(self._total)
        self._ipython_widget = ipython_widget

        self._signal_set = False
        if not ipython_widget:
            self._should_handle_resize = (_CAN_RESIZE_TERMINAL
                                          and self._file.isatty())
            self._handle_resize()
            if self._should_handle_resize:
                signal.signal(signal.SIGWINCH, self._handle_resize)
                self._signal_set = True

        self.update(0)
Ejemplo n.º 3
0
    def map(cls, function, items, multiprocess=False, file=None, step=100,
            item_len=None, nprocesses=None):
        """
        Does a `map` operation while displaying a progress bar with
        percentage complete.

        ::

            def work(i):
                print(i)

            ProgressBar.map(work, range(50))

        Parameters
        ----------
        function : function
            Function to call for each step

        items : sequence
            Sequence where each element is a tuple of arguments to pass to
            *function*.

        multiprocess : bool, optional
            If `True`, use the `multiprocessing` module to distribute each
            task to a different processor core.

        file : writeable file-like object, optional
            The file to write the progress bar to.  Defaults to
            `sys.stdout`.  If `file` is not a tty (as determined by
            calling its `isatty` member, if any), the scrollbar will
            be completely silent.

        step : int, optional
            Update the progress bar at least every *step* steps (default: 100).
            If ``multiprocess`` is `True`, this will affect the size
            of the chunks of ``items`` that are submitted as separate tasks
            to the process pool.  A large step size may make the job
            complete faster if ``items`` is very long.
        """

        results = []

        if file is None:
            file = _get_stdout()

        if item_len is not None:
            assert isinstance(item_len, int)
            if hasattr(items, "__len__"):
                assert item_len == len(items)
        else:
            if hasattr(items, "__len__"):
                item_len = len(items)
            else:
                # Will convert to iterable. Not a good thing to do with
                # large inputs.
                items = list(items)
                item_len = len(items)

        with cls(item_len, file=file) as bar:
            default_step = max(int(float(item_len) / bar._bar_length), 1)
            chunksize = min(default_step, step)
            if not multiprocess:
                for i, item in enumerate(items):
                    results.append(function(item))
                    if (i % chunksize) == 0:
                        bar.update(i)
            else:
                max_proc = multiprocessing.cpu_count()
                if nprocesses is None:
                    nprocesses = max_proc
                elif nprocesses > max_proc:
                    nprocesses = max_proc

                p = multiprocessing.Pool(nprocesses)
                for i, out in enumerate(p.imap_unordered(function,
                                                         items,
                                                         chunksize=1)):
                    bar.update(i)
                    results.append(out)
                p.close()
                p.join()

        return results
Ejemplo n.º 4
0
    def map(cls,
            function,
            items,
            multiprocess=False,
            file=None,
            step=100,
            item_len=None,
            nprocesses=None):
        """
        Does a `map` operation while displaying a progress bar with
        percentage complete.

        ::

            def work(i):
                print(i)

            ProgressBar.map(work, range(50))

        Parameters
        ----------
        function : function
            Function to call for each step

        items : sequence
            Sequence where each element is a tuple of arguments to pass to
            *function*.

        multiprocess : bool, optional
            If `True`, use the `multiprocessing` module to distribute each
            task to a different processor core.

        file : writeable file-like object, optional
            The file to write the progress bar to.  Defaults to
            `sys.stdout`.  If `file` is not a tty (as determined by
            calling its `isatty` member, if any), the scrollbar will
            be completely silent.

        step : int, optional
            Update the progress bar at least every *step* steps (default: 100).
            If ``multiprocess`` is `True`, this will affect the size
            of the chunks of ``items`` that are submitted as separate tasks
            to the process pool.  A large step size may make the job
            complete faster if ``items`` is very long.
        """

        results = []

        if file is None:
            file = _get_stdout()

        if item_len is not None:
            assert isinstance(item_len, int)
            if hasattr(items, "__len__"):
                assert item_len == len(items)
        else:
            if hasattr(items, "__len__"):
                item_len = len(items)
            else:
                # Will convert to iterable. Not a good thing to do with
                # large inputs.
                items = list(items)
                item_len = len(items)

        with cls(item_len, file=file) as bar:
            default_step = max(int(float(item_len) / bar._bar_length), 1)
            chunksize = min(default_step, step)
            if not multiprocess:
                for i, item in enumerate(items):
                    results.append(function(item))
                    if (i % chunksize) == 0:
                        bar.update(i)
            else:
                max_proc = multiprocessing.cpu_count()
                if nprocesses is None:
                    nprocesses = max_proc
                elif nprocesses > max_proc:
                    nprocesses = max_proc

                p = multiprocessing.Pool(nprocesses)
                for i, out in enumerate(
                        p.imap_unordered(function, items, chunksize=1)):
                    bar.update(i)
                    results.append(out)
                p.close()
                p.join()

        return results