Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表理解方法优化_Python_Performance_List Comprehension_Itertools - Fatal编程技术网

Python 列表理解方法优化

Python 列表理解方法优化,python,performance,list-comprehension,itertools,Python,Performance,List Comprehension,Itertools,我已经开发了一些Python代码,它围绕两个自定义类展开—一个“Library”类(Lib),它包含一个基于“Cas”类的多个对象的Python列表。我没有在这里发布这两个类的代码,但要理解我的问题,您真正需要知道的是“Library”对象包含Python列表,“Cas”对象包含各种属性,其中一些是字符串,一些是值 代码的目标之一是操作库类中的Python列表,并根据一些用户驱动的条件返回“Cas”对象的子集。例如,返回Cas对象,其中特定属性等于给定字符串或大于给定值 为此,我编写了以下通用方

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

代码的目标之一是操作库类中的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]
def filterLibrarySingle(self、filterField、filterMethod、filterValue1、filterValue2=None):
如果filterMethod=='eq':
self.Lib=[如果getattr(cas,filterField)=filterValue1,则self.Lib中cas的cas为cas]
elif filterMethod=='lt':
self.Lib=[getattr(cas,filterField)filterValue1时self.Lib中cas的cas]
elif filterMethod=='le':
self.Lib=[getattr(cas,filterField)=filterValue1时self.Lib中cas的cas]
elif filterMethod==“gelt”:
self.Lib=[getattr(cas,filterField)>=filterValue1和getattr(cas,filterField)self.Lib=[cas for cas in self.Lib如果getattr(cas,filterField)>=filterValue1和getattr(cas,filterField)运算符库定义了所有这些函数,因此可以更简单地重写

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)]
但是它没有
gelt
gele

因此,您可能需要创建字典:

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)]
filter\u方法={
'le':operator.le,
...
“gelt”:λa,b,c:a>=b和a“gele”:lambda a,b,c:a>=b和a加速这种处理的通常方法是取消纯python步骤,转而使用基于c的高速工具,包括
functools.partial()
itertools.imap()
itertools.ifilter()
操作符

你可能会发现dict是一种比所有这些ELIF更好的方法。你能举个例子吗?我怀疑,如果这个fn是你程序的瓶颈,问题实际上并不在于它是如何编写的,而在于它在你的应用程序中被调用了多少次。你可能就在那里……它可以被调用好几次再看一遍,它是ca虽然失败了好几次,但似乎仍然是时间/命中率方面的瓶颈