我开发了一些围绕两个自定义类的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知识还不够好!
我希望有人能够帮助提高此方法的性能。
非常感谢
标记
答案 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)]
但它没有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)]
但是,这些都不会影响您的应用程序的性能,您需要查看您的逻辑。