KeyError проверка величины на Python - PullRequest
0 голосов
/ 17 ноября 2018

В Python, анализируя одни и те же операции (одинаковые методы), я замечаю, что в разных типах данных, списка и словаря в этом случае они имеют разную эффективность (Big-O). Например:

# dictionary O(1) vs list O(n)

import timeit
import random

for i in range(10000, 1000001, 20000):
    t = timeit.Timer("random.randrange(%d) in x" % i,
                 "from __main__ import random,x")
    # not defining function, use the list x object in our test

    x = list(range(i))
    tempo_list = t.timeit(number=1000)
    x = {j: None for j in range(i)}
    tempo_dictionary = t.timeit(number=1000)
    print("%d,%10.3f,%10.3f" % (i, tempo_list, tempo_dictionary))

Аналогично, но с оператором del

remove = timeit.Timer("del x[0]", "from __main__ import x")
for i in range(1000000, 100000001, 1000000):
    x = list(range(i))
    rlist = remove.timeit(number=1000)
    x = {j: None for j in range(i)}
    rdict = remove.timeit(number=1000)
    print("%15.5f, %15.5f" % (rlist, rdict))

Но у меня проблема ...

Traceback (most recent call last):
  File "/home/julio/.config/sublime-text 3/Packages/User/Python/example.py", line 9, in <module>
    rdict = remove.timeit(number=1000)
  File "/usr/lib/python2.7/timeit.py", line 202, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
KeyError: 0

Объяснение этой ошибки, пожалуйста ...

1 Ответ

0 голосов
/ 17 ноября 2018

Это потому, что вы удалили 0 из словаря, поэтому при последующих вызовах x[0]:

нет
x = {0: None, 1: None}
del x[0]
# x = {1: None}
del x[0]
# KeyError

Я бы предложил выполнить какую-то функцию, когда вы просматриваете список ключей x.keys() и впоследствии удаляете каждую из них. Независимо от того, можете ли вы сделать это в Timer, я уверен, что кто-то гораздо более опытный с этим модулем может говорить лучше, чем я.

Как примечание, поиск по списку с индексом , подобным x[1115], имеет O (1), а не O (N)

...