什么是最快速的方式来命令调用对象方法没有

时间:2012-03-02 05:56:09

标签: python methods

当你给开发者一个" robs_numbers"对象,开发者可以按他们想要的任何顺序调用各种过滤器,例如obj.filter1()。filter2()。filtern()..

然而,通常我提前过滤的数字越多,过滤的速度就越快。

我希望开发人员能够以他们想要的任何顺序调用filter()方法。 然后开发人员返回一个robs_numbers对象(或者可能是一个可迭代的...)。 但是我希望我的方法(过滤器)实际按优先级()给出的顺序运行。

技术上priority()应该采用对过滤器:[args],以便我可以使用任何过滤器。然后,priority()将返回优先级值

以下是一些示例代码,但如果它更加pythonic,您可以完全更改对象:

from random import randint
data = [randint(0,100) for i in range(100)]

class robs_numbers():
    def __init__(self,numbers,_min,_max):
        self.numbers = iter(numbers)
        self._min = _min #approx
        self._max = _max #approx

    def bigger(self,x):
        print "priority = ", self.priority(x)
        return robs_numbers([i for i in self.numbers if i>x],x,self._max)

    def smaller(self,x):
        print "priority = ", self.priority(x)
        return robs_numbers([i for i in self.numbers if i<x],self._min,x)

    def order(self,backwards=False):
        print "priority = ", self.priority()
        self.numbers = iter(sorted(self.numbers,reverse=backwards))
        return self

    # ...
    # More filter methods
    # ...

    def priority(self,x=None):
        #works out the order methods should be called to increase efficiency
        if x is None:
            return 99999
        else:
            return abs(x-(self._max-self._min)/2)

和两个有效用途的例子,但是我希望它们都快,现在只有一个是有效的:

def get():
    return robs_numbers(data,0,100)

rf = get().bigger(80).smaller(90).order() #faster in this order
print list(rf.numbers), rf._min, rf._max

#priority =  30
#priority =  80
#priority =  99999
#[81, 81, 82, 83, 85, 86, 87, 87, 89] 80 90


rf = get().order().smaller(90).bigger(80) #slower in this order
print list(rf.numbers), rf._min, rf._max
#priority =  99999
#priority =  40
#priority =  35
#[81, 81, 82, 83, 85, 86, 87, 87, 89] 80 90

1 个答案:

答案 0 :(得分:1)

您必须创建某种延迟评估的查询集,并且只在开发人员调用list()或其他需要您将数据导出到另一个对象的其他内容时执行所有过滤器。 Django在其查询集which are lazy中有一个很好的例子。

所以,你可以写些什么来影响

class RobsNumbers(object):
    def __init__(self, numbers, min, max):
        self._numbers = numbers
        self._min = min
        self._max = max
        self._filters = []

    def bigger(self, x):
        new_obj = RobsNumbers(self._numbers, x, self._max)
        new_obj._filters = self._filters + [GreaterThanFilter(x)]
        return new_obj

    # Other filter methods simply add a filter to the _filters list of the object

    def __iter__(self):
        # Here is the complicated optimization logic to reorder and execute the filters
        pass

请注意,此代码执行零过滤,直到开发人员询问RobsNumbers对象中包含的数据,因此它非常懒惰。