Python在大数据中查找值的最快方法

时间:2012-03-29 01:48:09

标签: python performance

我有一个庞大的数据库,其中的行由“日期,广告,网站,展示次数,点击次数”字段构成

我通过python使用以下方法获得了所有这些:

cursor.execute(select * from dabase)
data = cursor.fetchall()

从所有这些数据中,我只需要对特定时间内发生的行进行采样,在特定网站上打印时,广告的点击次数大于零,例如:

row(1):( t1,ad1,site1) - > clicks = 1(t是时间)

row(2):( t2,ad1,site1) - > clicks = 0

因此点t1处的ad1和site1点击次数> 0因此必须采用包含ad1和site1的数据中的所有点并将其放入另一个列表,我称之为包含row(1)和row(2)的final_list(row(2)具有0点击次数,但由于时间t1 ad1和site1点击次数> 0,因此也必须使用此行)

当我尝试通过MySQL Workbench创建它时花了很长时间才收到错误消息“Lost Connection to Database”。我认为这是因为该表有近4000万行,即使我似乎人们在这里使用更大量的数据MySQL也无法处理它,这就是为什么我使用python(事实上,为了获得)点击次数> 0的行在python中花费了几秒钟,而通过MySQL花了超过10分钟,我不确定它到底有多长时间了)

我所做的是首先选择点数广告和网站点击> 0:

points = [(row[1], row[2]) for row in data if row[4]]
points = list(set(points))
dic = {}
for element in points:
    dic[element] = 1

此代码只需几秒钟即可运行。有了想要点的字典,我开始将数据插入到final_list中:

final_list = []
for row in data:
    try:
        if dic[(row[1], row[2])] == 1: final_list.append(row)
    except: continue

但这花了太长时间,我一直试图想办法让它变得更快。有可能吗?

我感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

我知道这些评论已经问过为什么你不能在数据库中做到这一点,我也不知道...但至于解决你的代码,你可能不需要一堆步骤在中间,如转换为列表 - >集 - >列表 - >字典。我确定列表append()正在杀死你,以及for循环。

这个怎么样?

points = set((row[1], row[2]) for row in data if row[4])
final_list = [d for d in data if (d[1], d[2]) in points]

您甚至可以看到获得点数的速度是否更快:

from operator import itemgetter
from itertools import ifilter

points = set(ifilter(itemgetter(4), data))
getter = itemgetter(1,2)
final_list = [d for d in data if getter(d) in points]

我的回答给你的问题带来了怀疑的好处,你没有选择通过更好的SQL查询从sql中做到这一点

答案 1 :(得分:-1)

你正在重新发明轮子。

WHERE查询中使用SELECT条款来过滤查询结果。

cursor.execute("SELECT * FROM dabase WHERE clicks > 0")

这更快,因为:

  • 对数据库进行了大量优化,以使SELECT ... WHERE非常快。它将比用于在Python中复制WHERE子句的字面任何方法快得多。
  • 需要在SQL服务器和您之间移动较少的数据(如果您的SQL服务器在网络上,则很重要。)而不是让SQL服务器向您发送所有数据,其中大多数是您的我要扔掉,让SQL服务器向你发送你真正想要的过滤数据。