列表理解方法优化

时间:2015-10-18 20:10:33

标签: python performance python-2.7

我开发了一些围绕两个自定义类的Python代码 - 一个'Library'类(Lib),它包含一个基于'Cas'类的几个对象的Python列表。我没有在这里发布这些类的代码,但是你真正需要知道的就是了解我的问题是'Library'对象包含一个Python列表而'Cas'对象包含各种属性,其中一些是字符串,有些是值。

代码的目标之一是操纵Library类中的Python列表,并根据一些用户驱动的标准返回'Cas'对象的子集。例如,返回特定属性等于给定字符串或大于给定值的Cas对象。

为此,我编写了以下通用方法filterLibrarySingle,允许我根据各种方法(filterMethod),属性(filterField)和值(filterValue)过滤库类(self.Lib)中的Python列表。在方法中,我使用列表推导来实现这一点。

在对我的代码进行分析时,看起来这个方法可能会有点瓶颈!有没有人知道如何加快速度?

def filterLibrarySingle(self, filterField, filterMethod, filterValue1, filterValue2=None):
    if filterMethod == 'eq':
        self.Lib = [cas for cas in self.Lib if getattr(cas, filterField) == filterValue1]

    elif filterMethod == 'lt':
        self.Lib = [cas for cas in self.Lib if getattr(cas, filterField) < filterValue1]

    elif filterMethod == 'gt':
        self.Lib = [cas for cas in self.Lib if getattr(cas, filterField) > filterValue1]

    elif filterMethod == 'le':
        self.Lib = [cas for cas in self.Lib if getattr(cas, filterField) <= filterValue1]

    elif filterMethod == 'ge':
        self.Lib = [cas for cas in self.Lib if getattr(cas, filterField) >= filterValue1]

    elif filterMethod == 'gelt':
        self.Lib = [cas for cas in self.Lib if  getattr(cas, filterField) >= filterValue1 and getattr(cas, filterField) < filterValue2]

    elif filterMethod == 'gele':
        self.Lib = [cas for cas in self.Lib if  getattr(cas, filterField) >= filterValue1 and getattr(cas, filterField) <= filterValue2]

我已经绞尽脑汁待了几天试图加快速度,但我想我的Python知识还不够好!

我希望有人能够帮助提高此方法的性能。

非常感谢

标记

2 个答案:

答案 0 :(得分:1)

加速这种处理的常用方法是消除纯python步骤,转而使用基于C的高速工具,包括<ul class="unordered"> <li class="header" style="z-index: 1000;"> <h3>Header1</h3> </li> <li class="header2" style="background:#666;z-index: 1000;height: 50px;"> <h5 style="margin: 0;">Header2</h5> </li> <li class="content"> Contents </li> </ul> <ul class="unordered"> <li class="header" style="z-index: 1000;"> <h3>Header1</h3> </li> <li class="header2" style="background:#666;z-index: 1000;height: 50px;"> <h5 style="margin: 0;">Header2</h5> </li> <li class="content"> Contents </li> </ul> functools.partial()itertools.imap(),{ {1}}和itertools.ifilter()

答案 1 :(得分:0)

运算符库已定义了所有这些函数,因此可以更简单地重写。

import operator
def filterLibrarySingle(self, filterField, filterMethod, filterValue1, filterValue2=None):
    self.Lib = [cas for cas in self.Lib
                if operator.__dict__[filterMethod](getattr(cas, filterField),filterValue1)]

但它没有geltgele 所以你可能要创建一个字典:

filter_methods = {
    'le': operator.le,
    ...
    'gelt': lambda a, b, c: a >= b and a < c
    'gele': lambda a, b, c: a >= b and a <= c
}

def filterLibrarySingle(self, filterField, filterMethod, filterValue1, filterValue2=None):
    if filterMethod in ['gelt', 'gele']:
        self.Lib = [cas for cas in self.Lib
                    if filter_methods[filterMethod](getattr(cas, filterField), filterValue1, filtervalue2)]
    else:
        self.Lib = [cas for cas in self.Lib
                    if filter_methods[filterMethod](getattr(cas,  filterField), filterValue1)]

但是,这些都不会影响您的应用程序的性能,您需要查看您的逻辑。