Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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.4 - Fatal编程技术网

Python 并行迭代字典以减少处理时间并提高性能

Python 并行迭代字典以减少处理时间并提高性能,python,python-3.4,Python,Python 3.4,我有一本这样的字典: { "ABC": { "Name": "ABC", "dates": { "2019-12-13": [ { "Status": "P" }, { "Status": "A" } ], "2019-12-14": [ { "Status": "P" },

我有一本这样的字典:

{
  "ABC": {
    "Name": "ABC",
    "dates": {
      "2019-12-13": [
        {
          "Status": "P"
        },
        {
          "Status": "A"
        }
      ],
      "2019-12-14": [
        {
          "Status": "P"
        },
        {
          "Status": "A"
        }
      ]
    }
  }
}
for key, value in result.items()
   for dkey, dvalue in value['dates'].items()
       process(key,value,dkey,dvalue)

def process(key, value, dkey, dvalue):
     ##Processing
     ##Insert into db process data
我是这样迭代的:

{
  "ABC": {
    "Name": "ABC",
    "dates": {
      "2019-12-13": [
        {
          "Status": "P"
        },
        {
          "Status": "A"
        }
      ],
      "2019-12-14": [
        {
          "Status": "P"
        },
        {
          "Status": "A"
        }
      ]
    }
  }
}
for key, value in result.items()
   for dkey, dvalue in value['dates'].items()
       process(key,value,dkey,dvalue)

def process(key, value, dkey, dvalue):
     ##Processing
     ##Insert into db process data

我们可以迭代dict.parallel以获得更好的性能吗?

您可以使用
多处理.Pool.map()
因此在值上并行运行该方法,您可以使用1个参数(更简单),因此只需
tuple
值即可

def process(values):
    key, value, dkey, dvalue = values
    # do your stuff


if __name__ == '__main__':
    todos = [(key, value, dkey, dvalue)
             for key, value in result.items()
             for dkey, dvalue in value['dates'].items()] # all the tuples

    cpu_percent = 0.5 # the number of processors to use = the number of thread
    with mp.Pool(int(mp.cpu_count() * cpu_percent)) as q:
        q.map(process, todos)

但正如您所说的insert into DB,我建议运行一些查询,但要插入多个元组,10个100值的插入查询要比1000个插入查询好;)

您可以使用
multiprocessing.Pool.map()
因此在值上并行运行该方法,您可以使用1个参数(更简单),因此只需
tuple
值即可

def process(values):
    key, value, dkey, dvalue = values
    # do your stuff


if __name__ == '__main__':
    todos = [(key, value, dkey, dvalue)
             for key, value in result.items()
             for dkey, dvalue in value['dates'].items()] # all the tuples

    cpu_percent = 0.5 # the number of processors to use = the number of thread
    with mp.Pool(int(mp.cpu_count() * cpu_percent)) as q:
        q.map(process, todos)

但正如您所说的insert into DB,我建议运行一些查询,但要插入多个元组,10个100值的插入查询要比1000个插入查询好;)

您是否做过任何基准测试/评测?几乎可以肯定,您的瓶颈在
def流程中。实际迭代时间可以忽略不计。在您开始并行化某些东西之前,您应该确保您在
def过程中没有做任何低效的事情,因为并行化并不是您在代码中添加以提高性能的魔法。你也可以把你的表现提高到最糟糕的程度。《优化前的概况》——引用一本著名的好书。。。这是值得效仿的it@RomanPerekhrest你指的是什么书?@StefanPochmann,“高效Python”你做过任何基准测试/评测吗?几乎可以肯定,你的瓶颈在
def过程中。实际迭代时间可以忽略不计。在您开始并行化某些东西之前,您应该确保您在
def过程中没有做任何低效的事情,因为并行化并不是您在代码中添加以提高性能的魔法。你也可以把你的表现提高到最糟糕的程度。《优化前的概况》——引用一本著名的好书。。。这是值得效仿的it@RomanPerekhrest你指的是什么书?@StefanPochmann,“有效的Python”这是一个相对较小的东西,但你可以只做
mp.cpu_count()//2
@AlexanderCécile它允许做0.25,0.5,0,75,…)是的,我想那是真的。您是否遇到过许多使用这些不同比率的情况?我本以为人们真的只使用
mp.cpu\u count()
,或者
mp.cpu\u count()-1
@AlexanderCécile我使用,OP可以像其他人一样自由使用部分或全部解决方案;)这是一件相对较小的事情,但您只需执行
mp.cpu_count()//2
@AlexanderCécile它允许执行0.25,0.5,0,75,…)是的,我想那是真的。您是否遇到过许多使用这些不同比率的情况?我本以为人们真的只使用
mp.cpu\u count()
,或者
mp.cpu\u count()-1
@AlexanderCécile我使用,OP可以像其他人一样自由使用部分或全部解决方案;)