2014-12-17 4 views
0

Я должен хранить 300+ объектов (пользователей) в памяти и получать этих пользователей в соответствии с их идентификатором. Каков наиболее эффективный способ сделать это?Python: эффективный способ хранения объектов

В настоящее время я храню объекты в списке, чтобы получить пользователь из списка я использую этот код:

[u for u in users if u.id == id] 

Это, кажется, не очень эффективны, как я должен итерацию над весь список в худшем случае.

+11

Создайте dict один раз и получите доступ с помощью ключа – vks

+0

Являются ли эти идентификаторы в последовательной числовой форме. Если да, то вы можете напрямую получить их по их индексу, иначе словарь будет отличным. –

+0

Нет, пользователи не заказываются. Я думаю, что использование дикта будет лучше. Благодаря! –

ответ

4

Создать диктофон.

users = {}

добавить значения каждого пользователя следующим образом.

users[user_id] = "user_value"

Вы можете просто извлечь конкретную запись с помощью идентификатора пользователя, как

users[user_id]

Вы можете хранить это либо в Монго или хранить его с помощью рассола.

1

Или использовать генераторы

вместо использования списка постижение ДИКТ использовать кортеж

(u for u in users if u.id == id)

EDIT

Если идентификаторы уникальны мое решение не имеет ничего общего, то dict лучше, но проблема в производительности связана с тем, что способ генератора имеет хороший пик производительности, как показывает мой тест производительности:

import timeit 

setup = """ 
from random import randint 

class User: 
    id = randint(0,10000) 

users = [User() for _ in range(0,100)] 

def generator_sample(users): 
    final = (u for u in users if u.id == 100) 

def list_sample(users): 
    final = [u for u in users if u.id == 100] 
""" 

print timeit.timeit('generator_sample(users)', setup=setup) # 0.413088083267 
print timeit.timeit('list_sample(users)', setup=setup) # 4.37370610237 
Смежные вопросы