Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中并发计算平均值?_Python_Python 3.x_Concurrency_Multiprocessing_Python Multiprocessing - Fatal编程技术网

如何在python中并发计算平均值?

如何在python中并发计算平均值?,python,python-3.x,concurrency,multiprocessing,python-multiprocessing,Python,Python 3.x,Concurrency,Multiprocessing,Python Multiprocessing,我在python中定义了两种计算平均值的正确方法 def avg_regular(values): total = 0 for value in values: total += value return total/len(values) def avg_concurrent(values): mean = 0 num_of_values = len(values) for value in values: #c

我在python中定义了两种计算平均值的正确方法

def avg_regular(values):
    total = 0
    for value in values:
        total += value
    return total/len(values)

def avg_concurrent(values):
    mean = 0
    num_of_values = len(values)
    for value in values:
        #calculate a small portion of the average for each num and add to the total
        mean += value/num_of_values  
    return mean
第一个函数是计算平均值的常规方法,但我编写了第二个函数,因为循环的每次运行都不依赖于以前的运行。因此,理论上平均值可以并行计算

然而,没有并行运行的并行程序比常规程序多花30%的时间

我的假设是否正确,是否值得损失速度? 如果是,如何使第二个函数并行运行第二个函数


如果没有,我哪里出错了?

您实现的代码基本上就是a1+a2+…+之间的差异an/n和a1/n+a2/n+…+不适用。结果是相同的,但在第二个版本中,有更多的操作,即n-1更多的分区,这会降低计算速度。您声称在第二个版本中,每个循环运行都独立于其他循环运行。在第一个循环中,我们需要以下信息来完成一次循环运行:运行前总计和当前值。在第二个版本中,我们需要以下信息来完成一次循环运行:运行前的平均值、当前值和数值。正如您在第二个版本中看到的,我们甚至依赖更多的值

但是,作为多处理的目标,我们如何在内核之间分配工作呢?我们可以只给一个核心值的前半部分和后半部分,即a1+a2+…+//2+an//2+1+…+不适用。是的,除以n的工作不是在内核之间进行的,但是它是一条指令,所以我们并不关心。我们还需要加上左边的总数和右边的总数,我们不能分割,但这只是一个单一的操作

因此,我们要运行的代码是:

def my_sum(values):
    total = 0
    for value in values:
        total += value
    return total
python仍然存在一个问题——通常可以使用线程来进行计算,因为每个线程将使用一个核心。但是在这种情况下,您必须注意您的程序不会遇到竞争条件,python解释器本身也需要注意这一点。CPython认为这不值得,基本上一次只在一个线程中运行。基本解决方案是通过多处理使用多个进程

from multiprocessing import Pool

if __name__ == '__main__':

    with Pool(5) as p:
        results = p.map(my_sum, [long_list[0:len(long_list)//2], long_list[len(long_list)//2:]))

    print(sum(results) / len(long_list)) # add subresults and divide by n
但当然,多个过程并不是免费的。你需要分叉,复制东西,等等,所以你不会像人们期望的那样获得2的加速。另外,最大的减速实际上是使用python本身,它并没有真正针对快速数值计算进行优化。有各种各样的方法,但使用可能是最简单的。只需使用:

import numpy
print(numpy.mean(long_list))

这可能比python版本快得多。我不认为numpy使用内部多处理,因此可以通过使用多个进程和快速实现numpy或其他用C编写的东西来获得提升,但通常numpy足够快。

异步是什么意思?在python中,asyncio执行异步IO,但这并没有真正帮助您。你想加快你的计算速度吗?看看努比。如果您想在多个内核上运行,请查看多处理python线程不能同时运行python代码。您的第二个版本每次除法和加法都要做更多的工作,所以我认为它需要更多的时间并不奇怪。@syntonym对不起,我的意思是并行而不是异步,就像在多个线程中运行一样。我该如何使用多进程呢?Ofc第二个比较慢。更多的分裂!你是在追求速度,还是你只是想理解多处理/并行计算的问题?@syntonym我想理解,但多处理的好处不是加快了速度吗?我不确定,但我认为你是对的,Numpy通常不使用多处理。然而,我认为,它确实尽可能使用vector/SIMD指令,我认为这是速度提高的部分原因。@Jarak看起来numpy通过BLAS完成了一些计算工作,所以在使用优化版本时,它应该使用vector,SIMD,指令级并行性等。此外,可以使用多线程编译BLAS,但我不确定sum是否使用它。一般来说,python速度相对较慢,因为它需要做很多事情,主要是创建python对象,并且简单地使用类似于或的东西会大大加快速度