python多处理效率

时间:2017-09-10 13:38:04

标签: python performance multiprocessing

计时器功能,用于计算multi_core_1和multi_core_2之间的成本时间

multi_core_1

results = p.map_async(deal, urls)

multi_core_2

for url in urls:
    results = p.map_async(deal, url)

代码

# !/usr/bin/env python
# -*- coding:utf-8 -*-

import time
import logging
from functools import wraps
from multiprocessing.dummy import Pool, Queue, Manager, freeze_support
import requests

urls = [
    'http://www.baidu.com',
    'http://home.baidu.com/',
    ```
    another 100 urls
]


def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        t = time.time()
        back = func(*args, **kwargs)
        logging.warn('%s cost %s' % (func.__name__, (time.time()-t)))
        return back
    return wrapper


def deal(url):
    return requests.get(url).status_code


@timer
def multi_core_1():
    freeze_support()
    p = Pool(8)
    results = p.map_async(deal, urls)
    p.close()
    p.join()


@timer
def multi_core_2():
    freeze_support()
    p = Pool(8)
    for url in urls:
        results = p.map_async(deal, url)
    p.close()
    p.join()


if __name__ == '__main__':
    multi_core_1()
    multi_core_2()

结果

> python test.py
WARNING:root:multi_core_1 cost 1.3149404525756836
WARNING:root:multi_core_2 cost 0.2142746448516845

问题

所以我想知道multi_core_2()如何比multi_core_1()

更快

2 个答案:

答案 0 :(得分:0)

实际上它并不快。计算性能是错误的方法,因为它取决于IO等待。我猜你的multi_core_2()速度更快,因为DNS已在multi_core_1()执行时得到解析和缓存。

答案 1 :(得分:0)

在第二个功能中,您使用map_async错误。

map_async需要应用函数和可迭代

当您将字符串作为可迭代项传递时,它会将字符串中的每个字符视为元素。因此,对于列表中的每个URL,它会尝试将deal函数单独应用于每个字符('h','t','t'等)。显然这在requests.get完全失败,所以它立即失败,不必加载页面,因此更快;但是它破碎的代码不起作用。

您还要在每次循环迭代时分配给results,因此它会在每个新URL上覆盖自己,并且只包含最后一个URL字符串的错误代码。

在检查功能性能之前,请确保该功能实际按预期工作。