如何在python中更有效地搜索大型列表?

如何在python中更有效地搜索大型列表?,python,mysql,Python,Mysql,问题:我正在处理一个非常大的数据集,需要对其进行迭代。我的程序每五分钟就添加大约1300行信息,每行有4列。这意味着在一天的时间里,它收集了大约374400行信息,即每天1497600个单元格。有1300行,因为程序每五分钟跟踪1300个项目。例如: Item_Name Price Quantity_in_Stock Maximum_Stock_Level ---------- Soap 1.00 10

问题:我正在处理一个非常大的数据集,需要对其进行迭代。我的程序每五分钟就添加大约1300行信息,每行有4列。这意味着在一天的时间里,它收集了大约374400行信息,即每天1497600个单元格。有1300行,因为程序每五分钟跟踪1300个项目。例如:

Item_Name       Price      Quantity_in_Stock        Maximum_Stock_Level
----------
Soap            1.00              10                     10                    
Frogs           1.25              12                     16
Pickled Yogurt  1.35               7                      8
Malodorous Ooze 6.66               6                     66
我试图统计一天中每种独特商品的库存水平的变化。我目前的技术是从mysql服务器提取整个数据集。我依赖于项目名称、库存水平、最大库存和观察日期:

q = """SELECT Item_Name,Item_In_Stock,Item_Max,Observation_Date
    FROM DB WHERE
    Observation_Date>DATE_ADD(curdate(),INTERVAL -1 DAY) """ 


try:
    x.execute(q)
    conn.commit()
    valueValue= x.fetchall() # The entire data set
except:
    conn.rollback()
然后我遍历每个项目的名称,并找到每个项目的所有匹配值:

for item in ItemNames:
     matching = [s for s in valueValue if item[0] in s] # item[0] is an item name, i.e. Soap, Frogs, Pickled Yogurt, etc.
之后,我想知道当天购买的物品数量。这是很棘手的,因为物品需要重新进货,因此我必须将每个时间间隔与最后一个时间间隔进行比较,以查看库存水平是否有任何变化(我不能只比较开始和结束):

这种方法可行,但速度相当慢。我已经将其计时为每个独特项目(1300个项目中的一个)计数迭代大约2.2秒。这意味着一整天大约需要50分钟来计算。如果可能的话,我想减少这次的时间。如何改进此搜索和清点功能

编辑:我已经尝试让MySQL使用以下代码来完成工作,但实际上比使用python对所有代码进行排序要慢:

for item in getnameValues: # for each item name execute the following query
    q = """SELECT Item_Name,Item_In_Stock,Item_Max,Observation_Date
       FROM DB WHERE
       Item_Name=%s and Observation_Date>DATE_ADD(curdate(),INTERVAL -1 DAY) """
 try:
    x.execute(q,item[0]) # executes the query for the current item
    conn.commit()
    valueValue= x.fetchall() 

我假设我需要一种方法来循环遍历MySQL中的所有项目,然后让它将列表列表发送回python。对吗?

为了获得更好的性能,应该使用mysql编程而不是python编程

如果您想控制表的每次插入,最好在mysql中使用trigger。如果你想在每天结束时(例如)进行搜索或做任何你想做的事情,你最好使用光标


你们可以在互联网上通过简单的搜索找到光标和触发器周围的很多东西。顺便说一句,tutsplus.com上有一些关于它们的简洁明了的教程。

对不起,以目前的形式来看,这一切看起来都很可怕

首先,计算结果似乎取决于运行它们的时间。你计算从昨天到现在的事情,而不仅仅是昨天。也就是说,今天(在运行脚本之前插入)的记录将在今天和明天进行处理

其次,您似乎对整个数据集
len(item\u names)
进行了多次迭代,即迭代150万行的1300次!为什么不使用or在单个迭代中进行处理


第三,最好使用整数值,而不是比较项目名称字符串

你为什么不在SQL查询中进行搜索呢?正如@BrenBarn所说的:你的DBMS是为这类工作设计的,很可能会比你更好地优化你的处理。如果我使用mysql而不是python,我将如何区分每个项目?此外,我如何将数据发送到python进行处理?哇,你最好让mysql为你+1做这件事,因为我想在任何有青蛙、肥皂和腌制酸奶的商店购物。
for item in getnameValues: # for each item name execute the following query
    q = """SELECT Item_Name,Item_In_Stock,Item_Max,Observation_Date
       FROM DB WHERE
       Item_Name=%s and Observation_Date>DATE_ADD(curdate(),INTERVAL -1 DAY) """
 try:
    x.execute(q,item[0]) # executes the query for the current item
    conn.commit()
    valueValue= x.fetchall()