python、字典或Mysql中有什么更好?

python、字典或Mysql中有什么更好?,python,mysql,variables,dictionary,Python,Mysql,Variables,Dictionary,什么会更快? 查询mysql以查看我需要的信息是否存在,或者 加载一个包含所有信息的python字典,然后检查id是否存在 如果python更快,那么最好的方法是什么?检查id是否存在 我正在使用python 2.4.3 我在搜索板上标记为正方形的数据,我在搜索x&y。 每个方块只有一个条目,信息不会改变,需要每秒调用几次 谢谢 完成了 我发现是python。我运行了下面的代码,mysql在0.0003秒内完成了这项工作,但是python在0.000006秒内完成了这项工作,mysql要搜索的内

什么会更快? 查询mysql以查看我需要的信息是否存在,或者 加载一个包含所有信息的python字典,然后检查id是否存在

如果python更快,那么最好的方法是什么?检查id是否存在

我正在使用python 2.4.3

我在搜索板上标记为正方形的数据,我在搜索x&y。 每个方块只有一个条目,信息不会改变,需要每秒调用几次

谢谢

完成了 我发现是python。我运行了下面的代码,mysql在0.0003秒内完成了这项工作,但是python在0.000006秒内完成了这项工作,mysql要搜索的内容要少得多,测试的内容是如何在现实生活中运行代码。我永远也不知道哪一个在CPU和RAM方面的开销更小,但如果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

Python应该快得多,但这在很大程度上取决于您的特定场景

my_dict.has_key('foobar')

您可能还想签出。

一般来说,如果您想从数据库获取信息,请向数据库询问您需要的信息。MySQL(和其他数据库引擎)旨在尽可能高效地检索数据

试图编写自己的数据检索过程,是在试图智胜那些已经赋予MySQL如此强大的数据处理能力的人才


这并不是说将数据加载到Python中永远都不合适,但您应该确保数据库查询不是第一步的正确方法。

一般来说,我认为Python速度更快,但是:
这取决于1)您要加载的表有多大(如果太大,python将不会有效率),以及2)您将要执行多少函数调用(因此有时最好将表加载到dict并在一个函数中执行所有查询)。

我不能说MySQL有多快(我不知道如何公平地对其进行基准测试),但是Python dict也有非常好的性能,并且不需要任何IO(与数据库查询相反)。假设
(x_pos,y_pos)
元组作为键和55 x 55字段(您提到了3000条记录,55^2大约是3000条)

每次查找0.004微秒(!)-祝你好运,DBMS的选择;)但由于你使用2.4,YMMV略有下降。 诚然,整数散列的元组会将非常有效的键(整数(适合散列数据类型)散列到它们自己,元组只是散列和异或它们的成员)。
此外,这并没有说明加载数据的速度有多快(尽管可以使用pickle模块进行高效序列化)。但是你的问题看起来就像你加载了一次数据,然后处理了一百万次。

我并不是想智胜那些制作MySQL的聪明人,我知道它已经很完美了。但是我想知道,是否将信息传递给mysql并将其传回所需的时间,以及mysql的工作方式,因为它是为什么而构建的。因为我不想搜索、比较和索引3000条记录,所以字典的开销会更小吗?你可能倾向于使用字典,因为你不需要特定表中的所有数据,而且你认为将需要的数据传输到Python并构建查找表会更快。但是在MySQL中创建一个
索引就可以了。绝对不要在MySQL中来回传输你不需要的数据。只选择要与所关心的条件匹配的字段。
has_key
是古老的(在Python2中永远不鼓励,在Python3中删除)。在我的字典中使用“foobar”
!仅仅因为它在Python3中被删除了,它就不算古老了。在2.6中,它没有给我任何弃用警告,在我看来,语法使意图更加清晰。我知道它在文档(2.7版)中是这样说的,但它并不古老。事实上,Python2.4文档中说“要检查字典中是否有单个键,请使用字典的has_key()方法。”注意:Python2.4确实很旧(5年)。在许多其他缺点中,这意味着您的版本缺少五年的优化。
>>> 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