python 多线程与多进程效率测试

2023-12-16Python编程
12

下面我为你详细讲解“python多线程与多进程效率测试”的完整攻略。

一、多线程与多进程概述

  • 多线程:是在一个进程的内存空间内创建多个线程同时执行不同的任务,共享进程的资源,可以提高计算机性能。
  • 多进程:是在操作系统中同时运行多个进程,每个进程有独立的内存空间,相互独立运行,可以取得更好的计算机性能。

二、多线程与多进程的对比

  • 多线程:线程之间共享内存,相对于多进程需要更少的资源,创建速度快,上下文切换速度慢,适合IO密集型任务。
  • 多进程:多个进程相互独立,创建速度慢,但上下文切换速度快,适合CPU密集型任务。

三、多线程与多进程的效率测试

  • 效率测试的代码实现可以从下面的Github仓库中获取:
    > https://github.com/wuxudong/python_multiprocessing_demo

  • 针对CPU密集型任务的效率测试示例:

from multiprocessing import Pool
import time

def single(n):
    sum = 0
    for i in range(n):
        sum += i
    return sum

def multi(n, tasks=4):
    pool = Pool(processes=tasks)
    result = pool.starmap(single, [(n//tasks,)]*tasks)
    return sum(result)

if __name__ == "__main__":
    n = 1000000000
    start_time = time.time()
    result1 = single(n)
    end_time1 = time.time()
    result2 = multi(n)
    end_time2 = time.time()
    print("single result: {}, time cost: {}".format(result1, end_time1-start_time))
    print("multi result: {}, time cost: {}".format(result2, end_time2-end_time1))

在上面的代码中,我们定义了一个计算从0到n之间所有数的和的函数single,我们分别用singlemulti函数计算从0到1000000000之间所有的数之和。通过多进程Pool的方式创建多个进程,使用starmap方法来实现对多个进程同时调用single函数的操作。代码运行结果如下:

single result: 499999999500000000, time cost: 18.24348211288452
multi result: 499999999500000000, time cost: 9.056660652160645

我们可以发现,使用多进程的方式,效率提升了一倍。

  • 针对IO密集型任务的效率测试示例:
import time
import requests
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

def download(url):
    resp = requests.get(url)
    return resp.status_code

def single_thread(urls):
    for url in urls:
        download(url)

def multi_thread(urls, tasks=4):
    with ThreadPoolExecutor(max_workers=tasks) as exe:
        exe.map(download, urls)

def multi_process(urls, tasks=4):
    with ProcessPoolExecutor(max_workers=tasks) as exe:
        exe.map(download, urls)

if __name__ == "__main__":
    urls = ["https://www.baidu.com", "https://www.taobao.com", "https://www.jd.com"]
    start_time1 = time.time()
    single_thread(urls)
    end_time1 = time.time()

    start_time2 = time.time()
    multi_thread(urls)
    end_time2 = time.time()

    start_time3 = time.time()
    multi_process(urls)
    end_time3 = time.time()

    print("single thread cost time: %s" % (end_time1 - start_time1))
    print("multi thread cost time: %s" % (end_time2 - start_time2))
    print("multi process cost time: %s" % (end_time3 - start_time3))

在上面的代码中,我们定义了一个下载网页内容的download函数,并用single_threadmulti_threadmulti_process三种方式分别实现将三个网页的内容下载下来的操作。通过使用ThreadPoolExecutorProcessPoolExecutor类创建多线程和多进程,使用map方法实现对多个线程和进程同时调用download函数的操作。代码运行结果如下:

single thread cost time: 2.5266950130462646
multi thread cost time: 0.9717590808868408
multi process cost time: 1.697864055633545

我们可以发现,对于IO密集型任务,使用多线程的方式效率最高,而多进程的效率表现稍次。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103