2014-09-30 4 views
0

У меня есть большой словарь заказов с ключами, равным заказом идентификаторов:Python - быстрый фильтр большой список/ДИКТ объектов по значениям атрибутов

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>} 

Как найти заказы с ценой меньше или равны заданным стоимость? Фильтрация происходит тысячи раз в секунду. В этом случае ошибки Dict/list слишком медленны.

Для избежания полных циклов, вероятно, требуется настраиваемый индекс или некоторая библиотека или база данных b-дерева, но я хотел бы сохранить ее максимально простой.

Заказы, которые удовлетворяют условиям фильтра, обычно составляют 1% от общего количества.

ответ

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] 
+0

Спасибо, но это не намного быстрее затем list (dict) comp, так как в этом случае требуется полный цикл по всем заказам. Что бы помогло - это какая-то структура пользовательских данных, в которой нет необходимости перебирать все заказы. Заказы, удовлетворяющие условиям фильтра, обычно составляют 1% от общего количества. – Sergey11g

+0

Возможно, вы сможете сортировать свой словарь 'orders' по цене по возрастанию, таким образом вы можете остановить цикл фильтра, когда первая цена выше заданного значения. - С этим вам придется перебирать диктофон при внесении нового заказа, но вы сэкономите время на поиск дешевых заказов. – Hrabal

+0

Хотя это хорошая идея, я не могу ее использовать, потому что заказы на самом деле сложнее и имеют больше атрибутов для фильтрации, чем в примере этого вопроса. – Sergey11g

Смежные вопросы