我有一个大型订单字典,其键等于订单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%。
答案 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]