【问题标题】:Improve performance when running the same function several times多次运行相同功能时提高性能
【发布时间】:2017-10-09 16:53:32
【问题描述】:

我目前正在编写一个基于 Python 的应用程序,该应用程序多次运行相同的函数,但从不使用相同的参数。

该应用程序的目标是通过 pywinrm 模块将 PowerShell 命令发送到服务器。这是一个简化的代码 sn-p 更新 Windows 文件夹的权限:

server = input('Please provide a server: ')
path = input('Provide the path of the folder: ')
permissions = ['Read', 'ReadAndExecute', 'List', 'Write', 'Modify']

run_ps_cmd(server, path, permissions[0])
run_ps_cmd(server, path, permissions[1])
run_ps_cmd(server, path, permissions[2])
run_ps_cmd(server, path, permissions[3])
run_ps_cmd(server, path, permissions[4])

目前,运行需要 20 秒,我想提高性能,但我不知道如何。我应该走哪个方向?并行、线程、多处理等...?

非常感谢。

【问题讨论】:

  • 需要查看代码示例以了解哪些选项对您的情况最有帮助。一般来说,线程适用于 I/O 密集型任务,多处理适用于 CPU 密集型任务。
  • 嗨@CasualDemon,感谢您的意见。我已使用代码 sn-p 更新了我的原始帖子,以提高您的知名度。
  • 只是猜测,因为您没有描述需要优化的run_ps_cmd 函数是什么。您可能首先想知道是否可以将相关数据作为一个整体收集,然后在本地进行处理。如果不可能,因为涉及到网络,它很可能是一个 IO 绑定任务,可以尝试多线程,方法是在自己的线程中运行每个 run_ps_cmd,然后加入所有线程。如果您想要更详细的答案,请显示相关代码。

标签: python python-3.x


【解决方案1】:

为了让它们并行运行,我只需将它们全部添加到多处理池中即可。

from multiprocessing import Pool
from functools import partial

server = input('Please provide a server: ')
path = input('Provide the path of the folder: ')
permissions = ['Read', 'ReadAndExecute', 'List', 'Write', 'Modify']

run_ps = partial(run_ps_cmd, (server, path)) 
# required due to how Pool.map only takes an interable 
# to pass each item in it to the function.

p = Pool(processes=5)
results = p.map(run_ps, permissions)
p.terminate()
p.join()

在 Python 3 中,它支持作为上下文管理器运行:

with Pool(processes=5) as p:
    results = p.map(run_ps, permissions)

我会提醒不要在不知道run_ps_cmd 的代码的情况下并行运行,或者如果线程池是 I/O 绑定的(在这种情况下将 PoolThreadPool 切换到 from multiprocessing.pool import ThreadPool .)

某人的随机文章有更多信息http://chriskiehl.com/article/parallelism-in-one-line/

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2021-06-14
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多