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

下面我为你详细讲解“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密集型任务,使用多线程的方式效率最高,而多进程的效率表现稍次。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 多线程与多进程效率测试 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Python字符串对齐方法使用(ljust()、rjust()和center())

    当我们在Python程序中进行字符串处理时,经常会遇到需要对字符串进行对齐的情况。Python提供了三个方法ljust()、rjust()和center()来实现字符串左对齐、右对齐和居中对齐。 1. ljust() 方法 ljust() 方法用于将字符串左对齐,并使用空格填充至指定长度。该方法的语法为:str.ljust(width[, fillchar]…

    python 2023年6月5日
    00
  • 编写同时兼容Python2.x与Python3.x版本的代码的几个示例

    编写既兼容Python2.x又兼容Python3.x的代码需要遵循以下几个规则: 使用print()函数代替print语句 在Python 2.x中,print是一个语句而非函数,因此可以直接使用print “Hello World!”这种形式输出。在Python 3.x中,print变成了一个函数,因此必须使用print(“Hello World!”)这种…

    python 2023年6月3日
    00
  • Python 正则表达式入门(初级篇)

    Python正则表达式入门(初级篇) 正则表达式是一种强大的文本处理工具,可以用于匹配、查找、替换和割字符串。Python提供了re模块来处理正则表达式。本文将为您详细讲解正则表达式的基础知识,包括正则表达式语法、re模块的常用方法和两个示例说明。 正表达式语法 在正则表达式中使用[]表示字符集,^表示取反,-表示围,+配一个或多个,*表示匹配零或多个字符,…

    python 2023年5月14日
    00
  • python标准库OS模块函数列表与实例全解

    下面就为大家介绍一下“Python标准库OS模块函数列表与实例全解”的攻略。 1. OS模块简介 OS模块是Python语言中的一个标准库,它提供了许多与操作系统交互的函数。使用OS模块可以实现操作文件和目录、进程管理、网络通信等功能。本攻略主要介绍OS模块的函数列表和实例。 2. OS模块函数列表 2.1 文件和目录操作 os.chdir(path):改变…

    python 2023年5月30日
    00
  • Python中逗号的三种作用实例分析

    下面是关于“Python中逗号的三种作用实例分析”的详细讲解攻略。 简介 在Python中,逗号是一个非常普遍的符号,它具有多种作用。本文将详细介绍逗号在Python中的三种主要作用,以及针对每种作用的示例说明。 作用一:元组 逗号最常见的作用是用于创建元组。 示例: tup = 1, 2, 3, 4 print(tup) # (1, 2, 3, 4) 在这…

    python 2023年5月14日
    00
  • Python简单计算数组元素平均值的方法示例

    下面我将为大家详细讲解一下“Python简单计算数组元素平均值的方法示例”的完整攻略。 什么是数组 在计算机科学中,数组是一种常见的数据结构,是一个由相同类型的元素组成的集合。在Python中,列表(list)就是一种数组的实现方式。 计算数组元素平均值的方法 计算数组元素平均值的方法就是将数组中的所有元素加起来,然后除以数组长度得到平均值。这个过程可以用以…

    python 2023年6月5日
    00
  • Python requests timeout的设置

    以下是关于Python requests timeout的设置的攻略: Python requests timeout的设置 在进行网络爬虫开发时,经常需要设置请求的超时时间,以避免请求时间过长而导致程序卡死。Python的requests库提供了设置timeout参数的方法,可以轻松实现。以下是Python requests timeout的设置的攻略。 …

    python 2023年5月14日
    00
  • python自动识别文本编码格式代码

    下面是演示Python自动识别文本编码格式的完整攻略: 1. 确定Python文件的编码格式 在 Python 语言中,默认文件编码是utf-8,但是有些情况下会有其他的编码格式,例如GBK、GB2312等。因为在文件解析时是需要了解各个字符码的。如果文件的编码格式指定错误,就会出现中文乱码情况。解决这个问题的方法是给文件前面添加必要的编码格式注释。 对于P…

    python 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部