У меня есть программа на C++, которая работает в течение длительного времени и выполняет партии (например, 1 000 000) итераций. Обычно я запускаю его из Python (обычно Jupyter Notebook). Я хотел бы увидеть прогресс от программы на C++. Есть ли удобный способ сделать это? Возможно, чтобы связать его с библиотекой баров прогресса Pythonic, например. tqdm?Показать прогресс в Python из основного процесса C++
ответ
Отказ от ответственности, я разработчик кода tqdm.
Я вижу 3 решения:
Либо касты Lib регулярно перезванивает питон, как после обработки каждой строки матрицы (как панд делает), а затем вы можете использовать индикатор Python как tqdm, как и для любого другого общего цикла питона. Цикл не будет обновляться на каждой итерации, но при каждом обратном вызове, поэтому это не реально в режиме реального времени, но если cpp lib работает быстро, вы ничего не заметите. См., Например, подмодуль tqdm_pandas, он работает именно так.
Либо cpp lib выполняет всю работу без какого-либо обратного вызова до конца (это максимизирует производительность, обратные вызовы на Python - огромные замедления), тогда вам нужно использовать индикатор выполнения cpp внутри вашей cpp lib, поскольку вы не можете использовать python one (так как он никогда не будет вызываться до конца). В разработке находится official cpp port of tqdm, это может подойти вашим потребностям.
Последний случай, если ваша программа cpp не является связанной библиотекой, а является автономной программой, которая может быть запущена из командной строки. В этом случае tqdm имеет возможности взаимодействовать с такими программами, пока ваша программа cpp может выводить что-то. См. Readme об этом, он хорошо работает для gzipping и других команд Unix Commin.
Ноутбуки - это не лучший вариант для длинных сценариев. Рассмотрите возможность использования командной строки для вызова сценария. При этом вы можете распечатать обновления статуса с C++. В качестве альтернативы, создайте и обновите файл C++ для файла вывода –
Если вы можете открыть функцию, которая запускает заданное количество итераций (поэтому она принимает> 0,1 с), вы можете получить цикл в Python, который вызывает это и обновляет индикатор выполнения. Вы не хотите, чтобы он возвращался на Python на каждой итерации, потому что это добавит справедливый бит накладных расходов. –