Хотел бы поделиться простым, но полезным инструментом. Когда много работаешь с данными, часто возникают примитивные, но долгие операции, например: «скачать 10 000 урлов», «прочитать файл на 2Гб, и что-то сделать с каждой строчкой», «распарсить 10 000 html-файлов и достать заголовки». Долго смотреть в зависший терминал тревожно, поэтому долгое время я использовал следующий гениальный код: ![](https://habrastorage.org/files/41d/b19/857/41db19857a664e74b03d763e7243f0c3.gif)
Эта функция прекрасна, больше года она кочевала у меня из задачи в задачу. Но недавно я заметил в стандартной поставке Jupyter виджет IntProgress и понял, что пора что-то менять:
![](https://habrastorage.org/files/fde/8d9/be6/fde8d9be6e4f4cae9bc1c169bfd6a688.gif)
У логирования в stderr есть три небольшие проблемы:
Как и многие люди, которые работают с данными, я фанат Jupyter. Большую часть времени провожу там. Поэтому могу позволить себе следующее, несовместимое с другими средами, решение:![](https://habrastorage.org/files/c67/996/ac5/c67996ac58024bfa9929b30e3ae56e8f.gif)
Всё то же самое, только счётчик выводится не в stderr, а в специальный виджет. Очень просто и удобно. Для тех, кто тоже подсел на Jupyter, я выложил немного улучшенную версию на Гитхаб github.com/alexanderkuk/log-progress. Модуль распространяется копипейстом. Пользуйтесь на здоровье.
Улучшенная версия выводит кроме полоски ещё и счётчик. И меняет цвет в зависимости от того успешно завершилась операция или нет:
![](https://habrastorage.org/files/d7a/1f5/9f6/d7a1f59f61634d63a42b274ba186d1ba.gif)
![](https://habrastorage.org/files/1bc/544/e8a/1bc544e8a50b419382d0fc090e087cce.gif)
Поддерживает итераторы:
![](https://habrastorage.org/files/712/255/d77/712255d77fd5473b8113e7bfc1bd852f.gif)
Естественно, в одной ячейке может быть несколько прогресс баров:
![](https://habrastorage.org/files/1b4/48f/9a5/1b448f9a5b74456091eb5b16799c7c3e.gif)
![](https://habrastorage.org/files/95d/c00/1df/95dc001dffb24852999a73ae8129a209.gif)
И они даже могут работать из разных тредов:
![](https://habrastorage.org/files/e64/69a/fe5/e6469afe59ed485c84565a672d24cd50.gif)
Короче, ещё раз ссылка на код github.com/alexanderkuk/log-progress.
def log_progress(sequence, every=10):
for index, item in enumerate(sequence):
if index % every == 0:
print >>sys.stderr, index,
yield item
![](https://habrastorage.org/files/41d/b19/857/41db19857a664e74b03d763e7243f0c3.gif)
Эта функция прекрасна, больше года она кочевала у меня из задачи в задачу. Но недавно я заметил в стандартной поставке Jupyter виджет IntProgress и понял, что пора что-то менять:
![](https://habrastorage.org/files/fde/8d9/be6/fde8d9be6e4f4cae9bc1c169bfd6a688.gif)
У логирования в stderr есть три небольшие проблемы:
- Это некрасиво. Очевидно.
- Иногда это взрывает буфер.
- Иногда кто-то ещё пишет в stderr или stdout.
Как и многие люди, которые работают с данными, я фанат Jupyter. Большую часть времени провожу там. Поэтому могу позволить себе следующее, несовместимое с другими средами, решение:
def log_progress(sequence, every=10):
from ipywidgets import IntProgress
from IPython.display import display
progress = IntProgress(min=0, max=len(sequence), value=0)
display(progress)
for index, record in enumerate(sequence):
if index % every == 0:
progress.value = index
yield record
![](https://habrastorage.org/files/c67/996/ac5/c67996ac58024bfa9929b30e3ae56e8f.gif)
Всё то же самое, только счётчик выводится не в stderr, а в специальный виджет. Очень просто и удобно. Для тех, кто тоже подсел на Jupyter, я выложил немного улучшенную версию на Гитхаб github.com/alexanderkuk/log-progress. Модуль распространяется копипейстом. Пользуйтесь на здоровье.
Улучшенная версия выводит кроме полоски ещё и счётчик. И меняет цвет в зависимости от того успешно завершилась операция или нет:
![](https://habrastorage.org/files/d7a/1f5/9f6/d7a1f59f61634d63a42b274ba186d1ba.gif)
![](https://habrastorage.org/files/1bc/544/e8a/1bc544e8a50b419382d0fc090e087cce.gif)
Поддерживает итераторы:
![](https://habrastorage.org/files/712/255/d77/712255d77fd5473b8113e7bfc1bd852f.gif)
Естественно, в одной ячейке может быть несколько прогресс баров:
![](https://habrastorage.org/files/1b4/48f/9a5/1b448f9a5b74456091eb5b16799c7c3e.gif)
![](https://habrastorage.org/files/95d/c00/1df/95dc001dffb24852999a73ae8129a209.gif)
И они даже могут работать из разных тредов:
![](https://habrastorage.org/files/e64/69a/fe5/e6469afe59ed485c84565a672d24cd50.gif)
Короче, ещё раз ссылка на код github.com/alexanderkuk/log-progress.
Arthur
pypi.python.org/pypi/tqdm
![image](https://habrastorage.org/getpro/habr/comment_images/909/77c/00b/90977c00ba2718f05eee6198385a88b2.gif)
couatl
Я думаю, автор был этим вдохновлен, но если совмещать tqdm с выводом (в ipython notebook), то tqdm ломается, а эта фича нет.
kmike
В tqdm поддержку IPython тоже добавят, думаю — см. github.com/tqdm/tqdm/pull/92. Идеи черпают из github.com/aplavin/ipy-progressbar и github.com/flying-sheep/smart-progress.
alexkuku
Может быть, в будущем буду пользоваться ими
chersanya
В своё время я как раз создал github.com/aplavin/ipy-progressbar для использования в notebook'ах, и сейчас действительно tqdm постепенно перенимают соответствующие фичи (а также асинхронность: __aiter__ и __anext__). Хорошо, что когда это доделают, будет один прогрессбар который можно использовать успешно в разных местах, который имеет нужные фичи и обновляется.