我有几个不同的函数,它们使用wmi模块以递归方式循环遍历我系统上的所有活动进程。如果它会有所帮助,那么基本上它是如何在没有任何优化的情况下循环:
c = wmi.WMI ()
for process in c.Win32_Process ():
#do various thing here, like find if there is a process running with a certain name, et cetera
出于某种原因,这需要花费相当长的时间。我用psutils做同样的事情。由于几个原因,我没有使用psutils。在https://wiki.python.org/moin/PythonSpeed/PerformanceTips查看优化的python wiki页面之后,看起来我可以做三件事来加快速度。其中一个是使用生成器表达式,它应该工作。然而,它还讨论了使用局部变量,以及避免“点”。如果我从不同的方法调用一些相同的类和方法,我可以通过命名类似c.Win32_Process的变量来从这些函数访问来减少点。但是,这也会创建一个全局变量,它比局部变量慢。哪个更好?以下是两种方法的基本图片(没有生成器表达式):
方式1:
def list_processes():
c = wmi.WMI ()
for process in c.Win32_Process ():
print process.ProcessId, process.Name
def grep_process(name):
c = wmi.WMI ()
for process in c.Win32_Process ():
if name in process.Name:
return process.ProcessId
return None
方式2
task_manager = wmi.WMI ()
def list_processes():
for process in task_manager.Win32_Process ():
print process.ProcessId, process.Name
def grep_process(name):
for process in task_manager.Win32_Process ():
if name in process.Name:
return process.ProcessId
return None
此外,这是一个可行的第三种解决方案,可以充分利用两个世界吗?
def manage_processes(command):
task_manager = wmi.WMI ()
if command == "list_processes":
for process in task_manager.Win32_Process ():
print process.ProcessId, process.Name
elif command == "grep_process"
for process in task_manager.Win32_Process ():
if name in process.Name:
return process.ProcessId
return None
这些变化可能不会很快改变速度,但它足够慢,我想尝试至少在某种程度上优化它。如果还有其他方法可以加快速度,我也很高兴听到这些。