gpt4 book ai didi

python - 分析 python 多处理池

转载 作者:行者123 更新时间:2023-12-01 04:29:56 25 4
gpt4 key购买 nike

我有一些代码使用 Python 的 multiprocessing 模块中的 Pool。性能不是我所期望的,我想分析代码以弄清楚发生了什么。我遇到的问题是每个作业的分析输出都会被覆盖,并且我无法积累合理数量的统计数据。

例如,使用:

import multiprocessing as mp
import cProfile
import time
import random

def work(i):
x = random.random()
time.sleep(x)
return (i,x)

def work_(args):
out = [None]
cProfile.runctx('out[0] = work(args)', globals(), locals(),
'profile-%s.out' % mp.current_process().name)
return out[0]

pool = mp.Pool(10)

for i in pool.imap_unordered(work_, range(100)):
print(i)

我只获取“最后”作业的统计数据,这可能不是计算要求最高的作业。我想我需要将统计数据存储在某个地方,然后只在池被清理时才将它们写出来。

最佳答案

我的解决方案涉及更长时间地保留配置文件对象,并且仅在“结束”时将其写出。描述了 Hook 到池拆卸better elsewhere ,但涉及使用 Finalize 对象在适当的时间显式执行 dump_stats()

这也让我能够整理我之前使用的 runctx 所需的笨拙的 work_ 蹦床。

import multiprocessing as mp
import cProfile
import time
import random

def work(i):
# enable profiling (refers to the global object below)
prof.enable()
x = random.random()
time.sleep(x)
# disable so we don't profile the Pool
prof.disable()
return (i,x)

# Initialise a good profile object and make sure it gets written during Pool teardown
def _poolinit():
global prof
prof = cProfile.Profile()
def fin():
prof.dump_stats('profile-%s.out' % mp.current_process().pid)

mp.util.Finalize(None, fin, exitpriority=1)

# create our pool
pool = mp.Pool(10, _poolinit)

for i in pool.imap_unordered(work, range(100)):
print(i)

加载输出显示确实记录了多次调用:

> p = pstats.Stats("profile-ForkPoolWorker-5.out")
> p.sort_stats("time").print_stats(10)
Fri Sep 11 12:11:58 2015 profile-ForkPoolWorker-5.out

30 function calls in 4.684 seconds

Ordered by: internal time

ncalls tottime percall cumtime percall filename:lineno(function)
10 4.684 0.468 4.684 0.468 {built-in method sleep}
10 0.000 0.000 0.000 0.000 {method 'random' of '_random.Random' objects}
10 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

关于python - 分析 python 多处理池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32521153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com