在Python中,字典和MySQL哪个更好?
哪个更快呢?是查询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 个回答
我不能确定MySQL的速度有多快(我没有足够的知识来公平地测试它),但Python的字典性能几乎是最优的,而且不需要任何输入输出操作(跟数据库查询相比)。假设你用的是
>>> 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模块来高效地序列化数据)。但你的问题看起来是你加载数据一次,然后处理一百万次。
一般来说,如果你想从数据库获取信息,就直接向数据库请求你需要的内容。MySQL(还有其他数据库系统)是为了尽可能高效地获取数据而设计的。
自己写程序去获取数据,就像是在试图超越那些已经让MySQL具备强大数据处理能力的高手们。
这并不是说在某些情况下把数据加载到Python中就绝对不合适,但你应该先确认一下,使用数据库查询是否是更好的选择。