Python实现ASCII字符串RSA加解密时如何并行化解密循环提速
优化方案说明
第一步:优先做零成本极速优化(改完速度提升至少100倍,比并行效果还好)
你现在解密慢最大的问题不是没并行,是pow函数用错了:
- 你现在的写法是
pow(j,d)再%n,会先计算出j的d次方这个超级大的整数(可能有几十万位),再做取模,计算量爆炸 - Python内置的
pow原生支持三个参数pow(base, exp, mod),直接用快速模幂算法,计算过程中每一步都取模,完全不会生成超大数,速度是你原来写法的上百倍
修改方法非常简单,把decrypt函数里原来的两行:
P1=pow(j,d) P=P1%n
直接改成一行:
P = pow(j, d, n)
同理你encrypt函数里的对应代码也可以这么改,加密速度也会大幅提升。绝大多数情况下改完这一行,解密速度就足够用了,根本不需要做并行。
第二步:如果要解密的字符量特别大,再加并行优化
并行原理
解密循环里每个字符的计算都是完全独立的,互相没有依赖,可以同时分给CPU的多个核心一起计算,缩短总耗时。我们直接用Python自带的multiprocessing库实现,不需要安装任何第三方工具。
具体修改步骤
- 开头导入并行库
在你现有import math下面加一行:
import multiprocessing
- 单独抽离单个字符的解密逻辑
加一个小函数,专门用来解密单个字符,方便并行调度:
def decrypt_single(j, d, n): P = pow(j, d, n) print("value of P is:", P) return P
- 改写
decrypt函数为并行版本
def decrypt(ascii_initial, d, n): # 自动获取你电脑的CPU核心数,也可以手动填数字比如4 core_count = multiprocessing.cpu_count() # 创建进程池,自动管理多进程调度 with multiprocessing.Pool(core_count) as pool: # 把所有待解密的字符打包成任务参数列表 task_params = [(j, d, n) for j in ascii_initial] # 并行执行所有任务,返回结果顺序和输入顺序完全一致 ascii_final = pool.starmap(decrypt_single, task_params) return ascii_final
- 修复Windows系统运行报错问题
Windows系统下运行多进程代码,必须把主逻辑代码放到if __name__ == "__main__":的判断下面,不然会重复启动进程报错。你把原来最外层的主循环代码全部套到这个判断里就行:
if __name__ == "__main__": cont = 'yes' while cont.lower() == 'yes': # 这里放你原来的输入、调用RSA的主逻辑代码 # 注意缩进要对
额外提示
你原来的代码还有缩进语法错误:rsa_algorithm函数里的p,q,r,s = 13,17,61,37之后的代码缩进全错了,都写到函数外面了,运行会报错,先把这些缩进修复再做上面的优化。
内容的提问来源于stack exchange,提问作者Aryan Garg
相关产品推荐
相关产品推荐

