window下tqdm进度条

news2024/11/15 2:19:18

原代码是linux下运行,修改后可在window下运行。

#ifndef TQDM_H
#define TQDM_H

#include <chrono>
#include <ctime>
#include <numeric>
#include <ios>
#include <string>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
#include <io.h>
class tqdm {
private:
	// time, iteration counters and deques for rate calculations
	std::chrono::time_point<std::chrono::system_clock> t_first = std::chrono::system_clock::now();
	std::chrono::time_point<std::chrono::system_clock> t_old = std::chrono::system_clock::now();
	int n_old = 0;
	std::vector<double> deq_t;
	std::vector<int> deq_n;
	int nupdates = 0;
	int total_ = 0;
	int period = 1;
	unsigned int smoothing = 50;
	bool use_ema = true;
	float alpha_ema = 0.1;

	std::vector<const char*> bars = { " ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█" };

	bool in_screen = (system("test $STY") == 0);
	bool in_tmux = (system("test $TMUX") == 0);
	bool is_tty = _isatty(1);
	bool use_colors = true;
	bool color_transition = true;
	int width = 40;

	std::string right_pad = "▏";
	std::string label = "";

	void hsv_to_rgb(float h, float s, float v, int& r, int& g, int& b) {
		if (s < 1e-6) {
			v *= 255.;
			r = v; g = v; b = v;
		}
		int i = (int)(h*6.0);
		float f = (h*6.) - i;
		int p = (int)(255.0*(v*(1. - s)));
		int q = (int)(255.0*(v*(1. - s * f)));
		int t = (int)(255.0*(v*(1. - s * (1. - f))));
		v *= 255;
		i %= 6;
		int vi = (int)v;
		if (i == 0) { r = vi; g = t;  b = p; }
		else if (i == 1) { r = q;  g = vi; b = p; }
		else if (i == 2) { r = p;  g = vi; b = t; }
		else if (i == 3) { r = p;  g = q;  b = vi; }
		else if (i == 4) { r = t;  g = p;  b = vi; }
		else if (i == 5) { r = vi; g = p;  b = q; }
	}

public:
	tqdm() {
		if (in_screen) {
			set_theme_basic();
			color_transition = false;
		}
		else if (in_tmux) {
			color_transition = false;
		}
	}

	void reset() {
		t_first = std::chrono::system_clock::now();
		t_old = std::chrono::system_clock::now();
		n_old = 0;
		deq_t.clear();
		deq_n.clear();
		period = 1;
		nupdates = 0;
		total_ = 0;
		label = "";
	}

	void set_theme_line() { bars = { "─", "─", "─", "╾", "╾", "╾", "╾", "━", "═" }; }
	void set_theme_circle() { bars = { " ", "◓", "◑", "◒", "◐", "◓", "◑", "◒", "#" }; }
	void set_theme_braille() { bars = { " ", "⡀", "⡄", "⡆", "⡇", "⡏", "⡟", "⡿", "⣿" }; }
	void set_theme_braille_spin() { bars = { " ", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠇", "⠿" }; }
	void set_theme_vertical() { bars = { "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "█" }; }
	void set_theme_basic() {
		bars = { " ", " ", " ", " ", " ", " ", " ", " ", "#" };
		right_pad = "|";
	}
	void set_label(std::string label_) { label = label_; }
	void disable_colors() {
		color_transition = false;
		use_colors = false;
	}

	void finish() {
		progress(total_, total_);
		printf("\n");
		fflush(stdout);
	}
	void progress(int curr, int tot) {
		if (is_tty && (curr%period == 0)) {
			total_ = tot;
			nupdates++;
			auto now = std::chrono::system_clock::now();
			double dt = ((std::chrono::duration<double>)(now - t_old)).count();
			double dt_tot = ((std::chrono::duration<double>)(now - t_first)).count();
			int dn = curr - n_old;
			n_old = curr;
			t_old = now;
			if (deq_n.size() >= smoothing) deq_n.erase(deq_n.begin());
			if (deq_t.size() >= smoothing) deq_t.erase(deq_t.begin());
			deq_t.push_back(dt);
			deq_n.push_back(dn);

			double avgrate = 0.;
			if (use_ema) {
				avgrate = deq_n[0] / deq_t[0];
				for (unsigned int i = 1; i < deq_t.size(); i++) {
					double r = 1.0*deq_n[i] / deq_t[i];
					avgrate = alpha_ema * r + (1.0 - alpha_ema)*avgrate;
				}
			}
			else {
				double dtsum = std::accumulate(deq_t.begin(), deq_t.end(), 0.);
				int dnsum = std::accumulate(deq_n.begin(), deq_n.end(), 0.);
				avgrate = dnsum / dtsum;
			}

			// learn an appropriate period length to avoid spamming stdout
			// and slowing down the loop, shoot for ~25Hz and smooth over 3 seconds
			if (nupdates > 10) {
				period = (int)(std::min(std::max((1.0 / 25)*curr / dt_tot, 1.0), 5e5));
				smoothing = 25 * 3;
			}
			double peta = (tot - curr) / avgrate;
			double pct = (double)curr / (tot*0.01);
			if ((tot - curr) <= period) {
				pct = 100.0;
				avgrate = tot / dt_tot;
				curr = tot;
				peta = 0;
			}

			double fills = ((double)curr / tot * width);
			int ifills = (int)fills;

			printf("\015 ");
			if (use_colors) {
				if (color_transition) {
					// red (hue=0) to green (hue=1/3)
					int r = 255, g = 255, b = 255;
					hsv_to_rgb(0.0 + 0.01*pct / 3, 0.65, 1.0, r, g, b);
					printf("\033[38;2;%d;%d;%dm ", r, g, b);
				}
				else {
					printf("\033[32m ");
				}
			}
			for (int i = 0; i < ifills; i++) std::cout << bars[8];
			if (!in_screen && (curr != tot)) printf("%s", bars[(int)(8.0*(fills - ifills))]);
			for (int i = 0; i < width - ifills - 1; i++) std::cout << bars[0];
			printf("%s ", right_pad.c_str());
			if (use_colors) printf("\033[1m\033[31m");
			printf("%4.1f%% ", pct);
			if (use_colors) printf("\033[34m");

			std::string unit = "Hz";
			double div = 1.;
			if (avgrate > 1e6) {
				unit = "MHz"; div = 1.0e6;
			}
			else if (avgrate > 1e3) {
				unit = "kHz"; div = 1.0e3;
			}
			printf("[%4d/%4d | %3.1f %s | %.0fs<%.0fs] ", curr, tot, avgrate / div, unit.c_str(), dt_tot, peta);
			printf("%s ", label.c_str());
			if (use_colors) printf("\033[0m\033[32m\033[0m\015 ");

			if ((tot - curr) > period) fflush(stdout);

		}
	}
};
#endif

主函数: 

#include "MyClass.h"
#include <windows.h>
int main() {

	int N = 2000;
	tqdm bar;

	std::cout << "Overhead of loop only:" << std::endl;
	for (int i = 0; i < 100000000; i++) {
		bar.progress(i, 100000000);
	}
	bar.finish();


	std::cout << "Basic:" << std::endl;
	bar.reset();
	bar.set_theme_basic();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(1000);
	}
	bar.finish();

	std::cout << "Braille:" << std::endl;
	bar.reset();
	bar.set_theme_braille();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(300);
	}
	bar.finish();

	std::cout << "Line:" << std::endl;
	bar.reset();
	bar.set_theme_line();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(300);
	}
	bar.finish();

	std::cout << "Circles:" << std::endl;
	bar.reset();
	bar.set_theme_circle();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(300);
	}
	bar.finish();

	bar.reset();
	std::cout << "Vertical bars:" << std::endl;
	bar.reset();
	bar.set_theme_vertical();
	for (int i = 0; i < N; i++) {
		bar.progress(i, N);
		Sleep(3000);
	}
	bar.finish();

	return 0;
}

源码 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

帕金森病友,你们需要的维生素秘籍来啦!✨

哈喽&#xff0c;小伙伴们~ &#x1f44b; 今天来跟大家聊聊帕金森病友们应该补充哪些维生素的小知识。&#x1f4a1; 帕金森病虽然是一种神经系统疾病&#xff0c;但合理的营养补充也能在一定程度上帮助缓解病情哦&#xff01;&#x1f4aa; &#x1f34e; 维生素C&#xff1a…

初步探究Rust生态与图形界面编程

引言 Rust作为一种现代的、安全的系统编程语言&#xff0c;自2010年问世以来&#xff0c;逐渐在开发社区中崭露头角。它的内存安全保证、并发处理能力、以及无需垃圾回收机制的高性能特性&#xff0c;使得它成为了开发系统工具、网络服务、以及嵌入式系统的热门选择。然而&…

通过maven基于springboot项目构建脚手架archetype

1、引入脚手架构建的插件依赖 <!--构建脚手架archetype--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-archetype-plugin</artifactId><version>3.2.1</version></plugin><plugin><…

Go语言---网络编程基础知识

网络协议 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。 假设&#xff0c;A、B 双方欲传输文件。规定: 第一次&#xff0c;传输文件名&#xff0c;接收方接收到文件名&#xff0c;应答OK 给传输方;第二次&#xff0c;发送文件…

美食菜谱点评小程序

美食菜谱点评小程序 功能介绍 用户注册登录&#xff1a;注册账号&#xff0c;然后使用注册的账号登录。 资讯功能&#xff1a;用户可以任意浏览资讯列表和详细信息。 美食菜谱库&#xff1a;点击所有菜谱菜单&#xff0c;支持查看所有的菜谱信息。 菜谱查询&#xff1a;在菜谱…

网络基础知识--网络硬件设备介绍(含eNSP模拟器命令使用)

华为 eNSP 模拟器安装教程可参考&#xff1a;华为 eNSP 模拟器安装教程&#xff08;内含下载地址&#xff09;_ensp下载-CSDN博客 华为eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;模拟器是一款由华为提供的免费网络仿真平台&#xff0c;主要用于模拟和…

MES实时监控食品加工过程中各环节的安全

在实时监控食品加工过程中各环节的安全风险方面&#xff0c;万界星空科技的MES&#xff08;制造执行系统&#xff09;解决方案发挥了至关重要的作用。以下是具体如何通过MES系统实现实时监控食品加工过程中各环节安全风险的详细阐述&#xff1a; 一、集成传感器与实时监控 MES…

JDK 和 JRE:它们之间的区别是什么?

JDK 和 JRE&#xff1a;它们之间的区别是什么&#xff1f; 1、JRE&#xff08;Java Runtime Environment&#xff09;1.1 JRE的主要组成部分1.2 JRE的用途 2、JDK&#xff08;Java Development Kit&#xff09;2.1 JDK的主要组成部分2.2 JDK的用途 3、总结 &#x1f496;The Be…

景联文科技以高质量多模态数据集赋能AI大模型,精准匹配提升模型性能

在人工智能的浪潮中&#xff0c;语料数据如同建筑的基石&#xff0c;其质量、规模和运用策略直接决定了AI模型的表现和应用的广泛性。 景联文科技在AI领域深耕多年&#xff0c;打磨了高质量多模态数据集&#xff0c;致力于为不同训练阶段的算法精准匹配高质量数据资源。 3000万…

AI 助力,歌词创作不再是难题

在音乐的世界里&#xff0c;歌词创作一直被视为一项充满挑战和灵感的艺术工作。然而&#xff0c;随着科技的飞速发展&#xff0c;AI 技术的出现正在悄然改变这一局面&#xff0c;让曾经困扰众多创作者的难题迎刃而解。 “妙笔生词智能写歌词软件&#xff08;veve522&#xff0…

C语言中字符串(字符数组)中含有 0x00 (‘\0‘)引发的问题和解决办法

问题 在C语言中&#xff0c;字符串是以空字符&#xff08;null character&#xff0c;即\0或0x00&#xff09;结尾的字符数组。这种设计意味着字符串中的任何 0x00 字符都会被解释为字符串的结束。因此&#xff0c;如果字符串内部包含0x00字符&#xff0c;这实际上会将字符串分…

03、Kerberos安全认证之配置和访问Kerberos安全认证的Hadoop集群学习笔记

文章目录 前言一、Hadoop集群 Kerberos安全配置详细步骤1.1、安装libcrypto.so库1.2、创建HDFS服务用户1.3、配置各服务用户两两节点免密1.4、修改本地目录权限1.5、创建各服务Princial主体1.6、修改Hadoop配置文件1.6.1、配置core-site.xml1.6.2、配置hdfs-site.xml1.6.3、配置…

怎样在 PostgreSQL 中优化对时间序列数据的存储和查询策略?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 《PostgreSQL 中时间序列数据的优化存储与查询策略》 《PostgreSQL 中时间序列数据的优化存储与查询策…

同步低通滤波结合全变分的一维时间序列降噪方法(MATLAB)

关于全变分模型&#xff0c;可以参考&#xff1a; 如何理解全变分&#xff08;Total Variation&#xff0c;TV&#xff09;模型&#xff1f;- imxtx的回答 - 知乎 https://www.zhihu.com/question/47162419/answer/2585330101 全变分去噪的基本思想是&#xff0c;如果图像的…

gin源码分析

一、高性能 使用sync.pool解决频繁创建的context对象&#xff0c;在百万并发的场景下能大大提供访问性能和减少GC // ServeHTTP conforms to the http.Handler interface. // 每次的http请求都会从sync.pool中获取context&#xff0c;用完之后归还到pool中 func (engine *Engin…

前端Canvas入门——Canvas的一些注意事项

如果我们使用标签的方式去创建Canvas&#xff0c;可以发现&#xff1a; 在我们创建画笔的时候&#xff0c;是不会有任何提示的。 这意味着&#xff0c;你需要记住所有API代码——这就很烦人。 那么&#xff0c;又没有一种优雅的、不失格调的方法&#xff1f; 那就是使用JS去创…

内网对抗-代理通讯篇不出网或不可达SockS全协议规则配置C2正反向上线解决方案

知识点 1、代理隧道篇-代理通讯网络不可达-正反向连接上线 2、代理隧道篇-代理通讯网络不可达-SockS代理配置 实现步骤 1、在被控机器上获取下一级网段 2、在被控及其上建立SockS节点 3、在工具上配置连接属性和规则触发演示案例-代理技术-正反向监听/SockS配置-网络不可达…

LabVIEW航空发动机试验器数据监测分析

1. 概述 为了适应航空发动机试验器的智能化发展&#xff0c;本文基于图形化编程工具LabVIEW为平台&#xff0c;结合航空发动机试验器原有的软硬件设备&#xff0c;设计开发了一套数据监测分析功能模块。主要阐述了数据监测分析功能设计中的设计思路和主要功能&#xff0c;以及…

Ubuntu使用Nginx部署uniapp打包的项目

使用uniapp导出web项目&#xff1a; 安装&#xff1a; sudo apt install nginx解压web.zip unzip web.zip移动到/var/www/html目录下&#xff1a; sudo cp -r ~/web/h5/ /var/www/html/重启Nginx&#xff1a; sudo service nginx restart浏览器访问&#xff1a;http://19…

Docker安装RabbitMQ(带web管理端)

1.拉取带web管理的镜像 可以拉取rabbitmq对应版本的web管理端&#xff0c;比如&#xff1a;rabbitmq:3.9.11-management&#xff0c;也可以直接拉取带web管理端的最新版本 rabbitmq:management. docker pull rabbitmq:3.9.11-management 注意&#xff1a;如果docker pull ra…