为了账号安全,请及时绑定邮箱和手机立即绑定

我应该如何使用我所有的 CPU 能力有效地在 python 中加载文件?

我应该如何使用我所有的 CPU 能力有效地在 python 中加载文件?

Smart猫小萌 2021-08-14 17:24:41
不久前我决定创建一个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). 这是一个可怕的想法。您应该尽可能多地读取内存(如果内存大小允许,可能是整个文件),然后进行加密。


查看完整回答
反对 回复 2021-08-14
?
皈依舞

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()


查看完整回答
反对 回复 2021-08-14
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

不要使用“byte = f.read(1)”来从文件中加载 1 个字节,而是使用这个:


content = f.read()

for byte in content:

    # your code

使用这种方法,您可以在速度执行方面获胜,因为您不会停止在所有字节之间读取。您只能访问该文件一次。


查看完整回答
反对 回复 2021-08-14
  • 3 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号