不久前我决定创建一个python代码来加密我的数据,当我进行到一半时,我决定进行性能测试,结果很糟糕,加密速度只有430kB/s。打开系统监视器显示我的程序只使用了我的 8C16T 处理器的 1 个线程。在我尝试临时删除代码中的加密部分后,它的速度仅为 10kB/s。于是我分析了代码,发现了这部分代码with open("10MB.test", 'rb') as f: byte = f.read(1) if(i == 0): test = (str("".join([ch.encode("hex") for line in byte for ch in line]))) i = 1 while byte != "": g = g + 1 byte = f.read(1) a = str("".join([ch.encode("hex") for line in byte for ch in line])) test = test + a运行很慢,系统监视器显示它只使用我的 cpu 的一个线程。有没有办法利用我的 CPU 的所有线程来使它运行得更快?
3 回答

宝慕林4294392
TA贡献2021条经验 获得超8个赞
您一次读取一个字节的文件:f.read(1)
. 这是一个可怕的想法。您应该尽可能多地读取内存(如果内存大小允许,可能是整个文件),然后进行加密。

皈依舞
TA贡献1851条经验 获得超3个赞
如果您需要访问所有 CPU 内核,则需要使用 Pythons Multiprocessing 模块。
来自文档;
在多处理中,通过创建一个 Process 对象然后调用它的 start() 方法来产生进程。进程遵循threading.Thread的API。多进程程序的一个简单例子是
from multiprocessing import Process
def f(name):
print('hello', name)
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()

缥缈止盈
TA贡献2041条经验 获得超4个赞
不要使用“byte = f.read(1)”来从文件中加载 1 个字节,而是使用这个:
content = f.read()
for byte in content:
# your code
使用这种方法,您可以在速度执行方面获胜,因为您不会停止在所有字节之间读取。您只能访问该文件一次。
添加回答
举报
0/150
提交
取消