Что лучше в Python, словаре или Mysql? - PullRequest
5 голосов
/ 10 октября 2010

Что будет быстрее? Запросите MySQL, чтобы увидеть, есть ли нужная мне информация, ИЛИ загрузить словарь Python со всей информацией, а затем просто проверить, есть ли идентификатор

Если python быстрее, то что лучше всего проверить, если идентификатор существует?

Я использую Python 2.4.3

Я ищу данные, помеченные квадратом на доске, я ищу x & y. Theres только одна запись на квадрат, информация не изменится, и ее нужно вызывать несколько раз в секунду.

Спасибо!

Закончено

Я понял, это был питон. Я запустил приведенный ниже код, и mysql сделал это за 0,0003 секунды, но python сделал это за 0,000006 секунды, и у mysql было гораздо меньше возможностей для поиска, и тест был запущен так, как код будет работать в реальной жизни. Какой из них имел меньше накладных расходов в процессоре и оперативной памяти, я никогда не узнаю, но если скорость Python является чем-то, чтобы пойти на 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 ]

4 голосов
/ 10 октября 2010

Вообще говоря, если вам нужна информация из базы данных, спросите базу данных, что вам нужно . MySQL (и другие механизмы баз данных) предназначены для максимально эффективного извлечения данных.

Попытка написать собственные процедуры для извлечения данных - это попытка перехитрить талантливых людей, которые уже наполнили MySQL такой мощью обработки данных.

Это не означает, что никогда не подходит для загрузки данных в Python, но вы должны быть уверены, что запрос к базе данных - неправильный путь.

1 голос
/ 10 октября 2010

Python должен быть намного быстрее, но это во многом зависит от вашего конкретного сценария.

my_dict.has_key('foobar')

Вы можете проверить Фильтры Блума .

0 голосов
/ 10 октября 2010

Я не могу говорить о том, насколько быстрым был бы MySQL (мне не хватает ноу-хау для его сравнительного сравнения), но Python dict также имеет довольно оптимальную производительность и не требует ввода-вывода (в отличие от запросов к базе данных).Предполагая (x_pos, y_pos) кортежи в качестве ключей и поле 55 x 55 (вы упомянули 3000 записей, 55 ^ 2 - это примерно 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, YMMV немного.По общему признанию, кортежи хэшей ints создают очень эффективные ключи (целые числа (которые вписываются в хэш-тип данных), хэши сами по себе, кортежи просто хэшируют и перезаписывают своих членов).Кроме того, это ничего не говорит о том, как быстро будут загружаться данные (хотя вы можете использовать модуль pickle для эффективной сериализации).Но ваш вопрос звучит так, как будто вы загружаете данные один раз, а затем обрабатываете их миллион раз.

0 голосов
/ 10 октября 2010

В целом я думаю, что python быстрее, но: это зависит от 1) насколько велика таблица, которую вы хотите загрузить (если она слишком большая, она не будет эффективной с python), и 2) сколько вызовов функций у васвыполнить (поэтому иногда лучше загрузить таблицу в dict и выполнить все ваши запросы в пределах одной функции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...