Numpy为什么使用multiprocessing会有问题

Numpy为什么使用multiprocessing会有问题

在本文中,我们将介绍为什么在使用Numpy和multiprocessing两个Python库时,会遇到一些问题。

阅读更多:Numpy 教程

问题描述

在进行科学计算时,通常需要使用Numpy库进行数组和矩阵的操作,同时使用multiprocessing库提高计算效率。但是,当使用Numpy的随机数生成模块numpy.random时,结合multiprocessing使用时会出现一些奇怪的问题。比如,在不同的进程中生成的随机数相同,而且每次程序运行时,生成的数字也会随之改变。

问题解决

这个问题的根本原因在于:NumPy的随机数生成器使用的是由一个状态向后推导的算法,而multiprocessing无法保证生成随机数的顺序以及算法状态。解决这个问题的方法是使用进程安全的随机数生成器,比如Python中的random模块。

import random
import numpy as np
from multiprocessing import Pool

def worker(num):
    '''
    生成随机数,并打印所在的进程号
    '''
    np.random.seed()
    print("进程%d:" % num, np.random.random())
    print("进程%d:" % num, random.random())

if __name__ == '__main__':
    with Pool(processes=4) as pool:
        pool.map(worker, range(4))
Python

在上面的代码中,我们使用了Python的random模块生成进程安全的随机数。使用 np.random.seed() 函数指定随机数生成器的状态,每个进程生成不同的状态。另外,我们还在每个进程里同时生成了 np.randomrandom 两个模块的随机数,可以看到每次运行时,生成的数字都是不一样的。

总结

在使用Numpy和multiprocessing的时候,需要注意NumPy的随机数生成器不是进程安全的,可能会导致生成重复的随机数。我们可以使用Python的进程安全随机数生成器解决这个问题。这个问题的解决方法对其他使用NumPy的Python程序也是有指导意义的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册