Python 列表理解方法优化
我已经开发了一些Python代码,它围绕两个自定义类展开—一个“Library”类(Lib),它包含一个基于“Cas”类的多个对象的Python列表。我没有在这里发布这两个类的代码,但要理解我的问题,您真正需要知道的是“Library”对象包含Python列表,“Cas”对象包含各种属性,其中一些是字符串,一些是值 代码的目标之一是操作库类中的Python列表,并根据一些用户驱动的条件返回“Cas”对象的子集。例如,返回Cas对象,其中特定属性等于给定字符串或大于给定值 为此,我编写了以下通用方法filterLibrarySingle,以允许我基于各种方法(filterMethod)、属性(filterField)和值(filterValue)过滤库类(self.Lib)中的Python列表。在这个方法中,我使用列表理解来实现这一点 在分析我的代码时,这个方法似乎有点瓶颈!有人知道我该如何加速吗Python 列表理解方法优化,python,performance,list-comprehension,itertools,Python,Performance,List Comprehension,Itertools,我已经开发了一些Python代码,它围绕两个自定义类展开—一个“Library”类(Lib),它包含一个基于“Cas”类的多个对象的Python列表。我没有在这里发布这两个类的代码,但要理解我的问题,您真正需要知道的是“Library”对象包含Python列表,“Cas”对象包含各种属性,其中一些是字符串,一些是值 代码的目标之一是操作库类中的Python列表,并根据一些用户驱动的条件返回“Cas”对象的子集。例如,返回Cas对象,其中特定属性等于给定字符串或大于给定值 为此,我编写了以下通用方
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虽然失败了好几次,但似乎仍然是时间/命中率方面的瓶颈