通过避免使用“点”或使用局部变量来改善python中的性能吗?

时间:2014-01-07 04:32:16

标签: python performance wmi

我有几个不同的函数,它们使用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

这些变化可能不会很快改变速度,但它足够慢,我想尝试至少在某种程度上优化它。如果还有其他方法可以加快速度,我也很高兴听到这些。

0 个答案:

没有答案