我有一个包含 tool_id、时间和消息的元组列表。我想从此列表中选择消息与某个字符串匹配的所有元素,以及时间在该工具的任何匹配消息的某个差异范围内的所有其他元素。
以下是我目前的做法:
# record time for each message matching the specified message for each tool
messageTimes = {}
for row in cdata: # tool, time, message
if self.message in row[2]:
messageTimes[row[0], row[1]] = 1
# now pull out each message that is within the time diff for each matched message
# as well as the matched messages themselves
def determine(tup):
if self.message in tup[2]: return True # matched message
for (tool, date_time) in messageTimes:
if tool == tup[0]:
if abs(date_time-tup[1]) <= tdiff:
return True
return False
cdata[:] = [tup for tup in cdata if determine(tup)]
此代码有效,但运行时间太长 - 例如,当 cdata 有 600,000 个元素(这对于我的应用程序来说很典型)时,它需要 2 小时才能运行。
该数据来自数据库。最初我只是使用 SQL 获取我想要的数据,但这也花费了太长时间。我只选择了我想要的消息,然后为每个人做另一个查询以在每个人的时间差异内获取数据。这导致了数以万计的查询。所以我将其更改为一次提取所有潜在的匹配项,然后在 python 中处理它,认为这样会更快。也许我错了。
谁能给我一些加快速度的建议?
按照建议更新我的帖子以显示我在 SQL 中所做的事情。
我在 SQL 中所做的非常简单。第一个查询类似于:
SELECT tool, date_time, message
FROM event_log
WHERE message LIKE '%foo%'
AND other selection criteria
这已经足够快了,但它可能会返回 20 或 30,000 行。然后我遍历结果集,并为每一行运行一个这样的查询(其中 dt 和 t 是上面选择的一行中的 date_time 和工具):
SELECT date_time, message
FROM event_log
WHERE tool = t
AND ABS(TIMESTAMPDIFF(SECOND, date_time, dt)) <= timediff
那花了大约一个小时。
我还尝试在一个嵌套查询中执行,其中内部查询从我的第一个查询中选择行,外部查询选择时间差异行。那花了更长的时间。
所以现在我选择没有消息 LIKE '%foo%' 子句,我正在取回 600,000 行并试图从 python 中提取我想要的行。