2012-12-04 3 views
6

У меня очень большой словарь, возможно, около 10,000 keys/values, и я хочу одновременно изменить все значения на 0. Я знаю, что я могу выполнить цикл и установить все значения в 0, но это требуется навсегда. Есть ли в любом случае, что я могу одновременно установить все значения 0?Одновременно замена всех значений словаря на нуль python

метод Looping, очень медленно:

#example dictionary 
a = {'a': 1, 'c': 1, 'b': 1, 'e': 1, 'd': 1, 'g': 1, 'f': 1, 'i': 1, 'h': 1, 'k': 1, 
'j': 1, 'm': 1, 'l': 1, 'o': 1, 'n': 1, 'q': 1, 'p': 1, 's': 1, 'r': 1, 'u': 1, 
't': 1, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1} 
for key.value in a.items(): 
    a[key] = 0 

Выходные:

{'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0, 
'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0, 
't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0} 
+0

Вы профилированного свой код и нашел, что это является ограничивающим фактором ? Словарь с 10 тыс. Предметов не очень большой. –

+0

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

+0

Вы можете одновременно установить все значения в 0, если все значения будут в непрерывном блоке памяти. Я не думаю, что вы можете сделать это со встроенным dict ... если вы не создадите свой собственный dict, реализующий структуру данных в C. –

ответ

20

Вы хотите dict.fromkeys():

a = dict.fromkeys(a, 0) 
+0

- это что-то быстрее, чем цикл? и я полагаю, что это займет в два раза больше памяти во время работы, поскольку это создает отдельную копию, правильно? – ernie

+1

Удивительно, но цикл выполняется быстрее, ваш метод «10000000 циклов», лучший из 3: 0.0226 usec за цикл », цикл« 10000000 циклов », лучший из 3: 0.0224 usec за цикл' – enginefree

+1

@enginefree спасибо за профилирование; Я бы предположил, что оба должны быть похожими, поскольку как ваш оригинальный цикл, так и из клавиш, вероятно, используют итераторы. Я думаю, что идея креавитеты хранить пустую копию имеет смысл. – ernie

5

Спасибо @akaRem за комментарий :)

a = dict.fromkeys(a.iterkeys(), 0) 
+3

Поскольку вам не нужна копия всех ключей, лучше использовать 'iterkeys()' – akaRem

0

Если вы знаете, какой тип ваши ценности Dict должны быть, вы могли бы это:

  1. магазин в значения Dict в качестве array.array объекта. Это использует непрерывный блок памяти.
  2. ДИКТ, а не хранение фактических значений будет хранить индекс массива, при котором фактическое значение может быть найдено
  3. переинициализировать массив с непрерывной двоичной строкой нулей

Не протестировать производительность , но это должно быть быстрее ...


import array 

class FastResetDict(object): 

    def __init__(self, value_type): 
     self._key_to_index = {} 
     self._value_type = value_type 
     self._values = array.array(value_type) 

    def __getitem__(self, key): 
     return self._values[self._key_to_index[key]] 

    def __setitem__(self, key, value): 
     self._values.append(value) 
     self._key_to_index[key] = len(self._values) - 1 

    def reset_content_to_zero(self): 
     zero_string = '\x00' * self._values.itemsize * len(self._values) 
     self._values = array.array(self._value_type, zero_string) 



fast_reset_dict = FastResetDict('i') 
fast_reset_dict['a'] = 103 
fast_reset_dict['b'] = -99 

print fast_reset_dict['a'], fast_reset_dict['b'] 
fast_reset_dict.reset_content_to_zero() 
print fast_reset_dict['a'], fast_reset_dict['b'] 
1

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

Чтобы предотвратить это список использование понимание:

aDictionary = { x:0 for x in aDictionary} 

Примечание: Это только 2.7.x и 2.x эксклюзивные

Смежные вопросы