在Python中,字典和MySQL哪个更好?

6 投票
4 回答
8750 浏览
提问于 2025-04-16 05:17

哪个更快呢?是查询MySQL数据库看看我需要的信息是否存在,还是先把所有信息加载到一个Python字典里,然后直接检查这个ID是否在里面?

如果Python更快,那我该怎么检查这个ID是否存在呢?

我用的是Python 2.4.3。

我在找一些和棋盘上的方格相关的数据,我需要查找的是x和y坐标。每个方格只有一个条目,信息不会改变,而且我需要每秒多次调用这些信息。

谢谢你们!

结束

我发现Python更快。我运行了下面的代码,MySQL查询花了0.0003秒,而Python只花了0.000006秒。虽然MySQL需要查找的数据少得多,而且测试是在真实情况下运行的。我不知道哪个在CPU和内存使用上更省,但从速度来看,Python表现得更好。

谢谢你们的回答!

def speedtest():
 global search
 global data
 qb = time.time()
 search.execute("SELECT * FROM `nogo` where `1`='11' AND `2`='13&3'")
 qa = search.fetchall()
 print qa[0]
 qc =  time.time()
 print "mysql"
 print qb
 print qc
 print qc - qb

 data = {}
 for qa in range(15):
  data[qa] = {}
  for qb in range(300):
   data[qa][str(qb)] = 'nogo'
 qw = 5
 qe = '50'
 qb = time.time()
 print data[qw][qe]
 qc =  time.time()
 print "dictionary"
 print qb
 print qc
 print qc - qb

4 个回答

1

Python应该会更快一些,但这主要还是看你具体的情况。

my_dict.has_key('foobar')

你可能还想了解一下布隆过滤器

2

我不能确定MySQL的速度有多快(我没有足够的知识来公平地测试它),但Python的字典性能几乎是最优的,而且不需要任何输入输出操作(跟数据库查询相比)。假设你用的是这样的元组作为键,并且有一个55 x 55的区域(你提到有3000条记录,55的平方大约是3000)。

>>> the_dict = { (x, y) : None for x in range(55) for y in range (55) }
>>> len(the_dict)
3025
>>> import random
>>> xs = [random.randrange(0,110) for _ in range(55)]
>>> ys = [random.randrange(0,110) for _ in range(55)]
>>> import timeit
>>> total_secs = timeit.timeit("for x,y in zip(xs, ys): (x,y) in the_dict",
    setup="from __main__ import xs, ys, the_dict", number=100000)
>>> each_secs = total_secs / 100000
>>> each_secs
1.1723998441142385e-05
>>> each_usecs = 1000000 * each_secs
>>> each_usecs
11.723998441142385
>>> usecs_per_lookup = each_usecs / (55*55)
>>> usecs_per_lookup
0.0038757019640140115

每次查找只需要0.004微秒(!)——祝你好运能超越这个速度,选择的数据库管理系统;)不过因为你用的是2.4版本,可能会有些许差异。老实说,整数元组作为键的哈希效率非常高(整数(适合哈希数据类型的)会哈希到它们自己,元组则是对它们的成员进行哈希和异或运算)。另外,这里并没有提到加载数据的速度有多快(不过你可以使用pickle模块来高效地序列化数据)。但你的问题看起来是你加载数据一次,然后处理一百万次。

5

一般来说,如果你想从数据库获取信息,就直接向数据库请求你需要的内容。MySQL(还有其他数据库系统)是为了尽可能高效地获取数据而设计的。

自己写程序去获取数据,就像是在试图超越那些已经让MySQL具备强大数据处理能力的高手们。

这并不是说在某些情况下把数据加载到Python中就绝对不合适,但你应该先确认一下,使用数据库查询是否是更好的选择。

撰写回答