Python - 按属性值快速过滤对象的大型列表/字典

时间:2014-09-30 10:33:41

标签: python search filter indexing

我有一个大型订单字典,其键等于订单ID:

class Order():

    def __init__(self, ord_id, price, status='open'):
        self.ord_id = ord_id
        self.price = price
        self.status = status


orders = {'1': <order1>, '2': <order2>, ... , 'N': <orderN>}

如何查找价格小于或等于给定价值的订单?过滤每秒发生数千次。在这种情况下,字典/列表理解太慢了。

可能需要自定义索引或某些b-tree库或数据库来避免完全循环,但我希望尽可能简单。

满足过滤条件的订单通常为总数的1%。

1 个答案:

答案 0 :(得分:0)

Python的生成器通常很快:

def filterbyprice(seq, max_price):
   for el in seq:
       if seq[el].price <= max_price: yield el

生成器不会返回列表,而是一次返回一个元素,因此它们不会占用内存。

如果在循环中调用该函数,这将比创建列表并循环遍历该列表更快:

#this is the generator ("yeld" makes the function a generator)
def filterbyprice(seq, max_price):
   for el in seq:
        if seq[el].price <= max_price: yield el

class Order():
    def __init__(self, ord_id, price, status='open'):
        self.ord_id = ord_id
        self.price = price
        self.status = status

orders = {'1':Order(1,12),'2':Order(1,9),'3':Order(1,1)}

for cheap_order in filterbyprice(orders, 10):
    print cheap_order, orders[cheap_order], orders[cheap_order].price

输出:

3 <__main__.Order instance at 0x00B90170> 1
2 <__main__.Order instance at 0x00B90148> 9
[Finished in 0.2s]