首页 > 编程问答 >将多处理池与采用数组列表的函数结合使用

将多处理池与采用数组列表的函数结合使用

时间:2024-07-24 09:03:15浏览次数:12  
标签:python python-3.x numpy multiprocessing

我正在尝试编写一个函数来并行读取大量文件。我的代码如下:

import numpy as np
from multiprocessing import Pool
from functools import partial

def read_profiles(stamp,name,cols,*args):
   #This function reads each file.
   filename=name + '-' + str(int(timestep[stamp])) + '.dat'
   with open(filename) as f:
      xloc = 0
      for line in f:
         ele = line.rstrip("\n").split()
         for g in len(args):
            args[g][stamp,xloc] = float(ele[cols[g]])
         xloc = xloc + 1

timestep = np.arange(1,51)
x = np.ndarray(shape=(len(timestep),1001))
Ex = np.ndarray(shape=(len(timestep),1001))
j1 = np.ndarray(shape=(len(timestep),1001))
j2 = np.ndarray(shape=(len(timestep),1001))
j3 = np.ndarray(shape=(len(timestep),1001))
j4 = np.ndarray(shape=(len(timestep),1001))

terse_args = [x,Ex]
curr_args = [j1,j2,j3,j4]

with Pool(4) as pool:
   pool.map(partial(read_profiles,name='terse',cols=[0,2],*args=*terse_args),range(len(timestep)))
   pool.map(partial(read_profiles,name='current',cols=[1,2,3,4],*args=*curr_args),range(len(timestep)))

请注意,最后一个参数(*args)采用未知数量的二维数组。 上面的代码给我一个错误,指出 *args 处的“无效语法”。我尝试将它们作为不带关键字的位置参数传递,但随后出现错误,提示“名称”有多个值。

有谁知道如何在使用池时包含任意数量的二维数组作为函数的参数.map 和部分?

如果需要任何其他信息,请告诉我。 谢谢。


错误在于你试图解包 *args 的方式,以及你在 pool.map 中传递参数的方式。你不需要使用 *args 来传递 pool.map 中的额外参数。 functools.partial 可以处理这个问题。

下面是你的代码的修正版本:

import numpy as np
from multiprocessing import Pool
from functools import partial

def read_profiles(stamp, name, cols, *data_arrays):
    # 此函数读取每个文件。
    filename = name + '-' + str(int(timestep[stamp])) + '.dat'
    with open(filename) as f:
        xloc = 0
        for line in f:
            ele = line.rstrip("\n").split()
            for g, data_array in enumerate(data_arrays):
                data_array[stamp, xloc] = float(ele[cols[g]])
            xloc = xloc + 1

timestep = np.arange(1, 51)
x = np.ndarray(shape=(len(timestep), 1001))
Ex = np.ndarray(shape=(len(timestep), 1001))
j1 = np.ndarray(shape=(len(timestep), 1001))
j2 = np.ndarray(shape=(len(timestep), 1001))
j3 = np.ndarray(shape=(len(timestep), 1001))
j4 = np.ndarray(shape=(len(timestep), 1001))

terse_args = [x, Ex]
curr_args = [j1, j2, j3, j4]

with Pool(4) as pool:
    pool.map(partial(read_profiles, name='terse', cols=[0, 2], *terse_args), range(len(timestep)))
    pool.map(partial(read_profiles, name='current', cols=[1, 2, 3, 4], *curr_args), range(len(timestep)))

说明:

  1. partial 用于固定参数: 我们使用 functools.partial 来创建一个新的可调用对象,它将 name cols data_arrays 作为参数传递给 read_profiles 函数。
  2. *data_arrays 接受可变数量的参数: read_profiles 函数中,我们使用 *data_arrays 来接受任意数量的数组参数。然后,我们遍历这些数组,并使用提供的 cols 索引将值存储在其中。
  3. 直接传递数组: 在调用 pool.map 时,我们直接传递 terse_args curr_args 列表中的数组,而不是尝试解包它们。 partial 函数会将这些数组作为附加参数传递给 read_profiles

通过这些更改,你的代码应该能够正确地并行读取文件并将数据存储在提供的数组中。

标签:python,python-3.x,numpy,multiprocessing
From: 78785636

相关文章

  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 使用python,如何创建重复的工作时间表
    这是我们公司的小组工作安排表。为三班制,2组日夜工作,1组休息。重复白天工作4天休息2天,然后再次夜间工作4天休息2天的时间表。我想使用python(pandas)自动安排在8月9日之后。抱歉英语不好,提前感谢您的帮助以下是使用Python和Pandas创建重复工作时间表的代码......
  • venv 已激活,但 pip 安装仍然默认进行,并且 python 在源代码中看不到该库
    在终端shell中的vscode中输入“whichpython”显示默认路径:C:\Users\erjan\AppData\Local\Programs\Python\Python311\python.exe(my_venv)但是(my_venv)意味着我的venv处于活动状态,我做了pipinstalltransformers,但下面的代码仍然显示错误-无法看到......
  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • 在spyder-python上随机出现的这些奇怪的亮点是什么
    在此处输入图像描述每次我单击此按钮或进行任何更改时,都会创建奇怪的突出显示,当我最小化功能时更是如此。有什么建议如何摆脱这些或可能的原因是什么?谢谢!我尝试更改外观首选项中的设置,但无法影响问题。很抱歉,我无法直接查看或与Spyder界面交互。我是一个AI......
  • 比较Python字典并找到缺失的元素
    我遇到了一个问题,我已经尝试了几天但没有得到任何结果。我想比较两个字典,在一个字典中有“赛前”足球比赛,在第二个字典中有“现场”足球比赛。我想将它们相互比较并打印它们(如果有)没有赛前比赛直播。示例1pre=[{"Home":"Genoa","Away":"In......
  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......
  • 无法正确使用“comm.Gatherv()”来收集大小不均匀的 numpy 数组
    我正在学习MPI4Py,我想实现一个简单的程序。解释这里,每个等级都有一个send_array大小rank+1和值分别等于rank+1rank0=[1]rank1=[22]rank2=[333]rank3=[4444]我想收集值rank=0到缓冲区rbuf它的大......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......