多线程创造密码本(速度超快)

前几天有看到生成密码本的文章,但是那个是单线程的,跑的有点慢所以就自己搞了个多线程保存数据的密码本小脚本。

import string
import time
import concurrent.futures


def generate_passwords(length):
	# chars = string.ascii_lowercase + string.digits
	chars = '0123456789'
	passwords = []
	for i in range(length):
		if i == 0:
			passwords = list(chars)
		else:
			new_passwords = []
			for password in passwords:
				for char in chars:
					new_passwords.append(password + char)
			passwords = new_passwords
	return passwords


# 定义保存密码的函数
def save_passwords(passwords):
	with open('./保存的密码/password_book.txt', 'a') as f:
		for password in passwords:
			f.write(password + '\n')


if __name__ == '__main__':
	start_time = time.time()
	# 定义线程池
	with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pools:
		# 定义密码长度
		length = 8
		# 线程队列
		futures = []
		# 生成所有长度为length的密码组合
		passwords = generate_passwords(length)
		# 将密码列表分成10份,每份交给一个线程处理
		password_chunks = [passwords[i::10] for i in range(10)]
		# 使用线程池并发执行保存密码的函数
		for chunk in password_chunks:
			futures.append(pools.submit(save_passwords, chunk))
		
    # 判断线程池是否还有任务
	if all(f.done() for f in futures):
		print("线程池中没有任务了")
		end_time = time.time()
		print(end_time - start_time)

值得注意的是,在这个程序里面所有的密码数据都保存在passwords这个变量里面。

passwords

所以在生成位数长的密码时内存可能会爆掉。改进方法我想可以通过生成器来实现不过暂时没有这个需求

在修改的时候只需要修改chars这个变量和length就可以了。

chars = '0123456789'
# 定义密码长度
length = 8

运行结果:

文件高达900多M

运行时间:

多线程创造密码本(速度超快)_第1张图片

 运行时间90s可以接受。

你可能感兴趣的:(python,开发语言)