python计算密集型提速_Python - 多线程多进程代码加速

本文介绍了如何通过多线程和多进程来加速Python中的计算密集型和IO密集型任务。对于IO密集型任务,多线程能有效提升效率;而对于CPU密集型任务,多进程更为适用。文章给出了具体的代码示例,展示了单线程、多线程和多进程在不同场景下的性能对比。
摘要由CSDN通过智能技术生成

[1] - IO密集型

IO密集型,是指运行时大部分情况是 CPU 等待 I/O(硬盘/内存) 的读/写,CPU负载并不高. 一般情况下,由于任务依赖于大量的 I/O 操作,CPU 占用率比较低,没有充分利用 CPU 的处理的能力.

IO 密集型任务,如,涉及网络传输、磁盘读写等场景,其特点时CPU 消耗较少,大部分时间处于等待 I/O 操作,因为 I/O 的速度远低于 CPU 和内存的速度.

IO 密集型任务,任务越多,CPU效率越高. 适合于多线程处理.

[2] - CPU密集型

CPU密集型,也叫计算密集型,是指运行时大部分情况是 CPU 负载为 100%,CPU 读/写的 I/O 操作可以很快完成. 一般而言,可能是由于任务对 I/O 设备访问较少,或者是等待 I/O 的时间被多线程屏蔽,CPU 的占用率很高.

计算密集型任务需要进行大量的计算,依赖于 CPU 资源,如视频解码等.

1. 多线程加速 IO 密集型任务

如,单线程实现:#!/usr/bin/python3

#!--*-- coding:utf-8 --*--

import time

def testfun(idx):

with open(str(idx) + ".txt", "w") as fp:

s = ("hello world %d" %idx)*1000000

fp.write(s)

if __name__ == '__main__':

start = time.time()

for idx in range(100):

testfun(idx)

print('timecost: ', time.time() - start)timecost: 1.4586577415466309

多线程实现:#!/usr/bin/python3

#!--*-- coding:utf-8 --*--

import time

import threading

def testfun(idx):

with open(str(idx) + ".txt", "w") as fp:

s = ("hello world %d" %idx)*1000000

fp.write(s)

if __name__ == '__main__':

start = time.time()

thread_list = []

for idx in range(100):

t = threading.Thread(target=testfun,

args=(idx, ))

t.setDaemon(True) #设置为守护线程

thread_list.append(t)

print('timecost: ', time.time() - start)

for t in thread_list:

t.start() #启动线程

for t in thread_list:

t.join() #等待子线程结束timecost: 0.0008275508880615234

2. 多进程加速 CPU 密集型任务

如,单进程实现:#!/usr/bin/python3

#!--*-- coding:utf-8 --*--

import time

def muchjob(x):

time.sleep(5)

return (x**2)

if __name__ == '__main__':

start = time.time()

anns = [muchjob(idx) for idx in range(10)]

print('timecost: ', time.time() - start)

print(anns)timecost: 50.04609179496765

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

多进程实现:#!/usr/bin/python3

#!--*-- coding:utf-8 --*--

import time

import multiprocessing

data = range(10)

def muchjob(x):

time.sleep(5)

return (x**2)

if __name__ == '__main__':

start = time.time()

pool = multiprocessing.Pool(processes=4)

result = []

for idx in range(10):

result.append(pool.apply_async(muchjob, (idx, )))

pool.close()

pool.join()

ans = [res.get() for res in result]

print('timecost: ', time.time() - start)

print(anns)timecost: 15.098523378372192

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

3. Related

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值