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可以像其他人一样自由使用部分或全部解决方案;)