2015-06-06 1 views
0

Здесь дель оператор приурочен:времени, сколько времени требуется, чтобы сделать в операторе

from timeit import Timer 

def build_list(n): 
    return list(range(n)) # create list of 1 to n 


def build_dict(n): # build dict = { 0:"0", 1:"1", 2:"2", ... n:"n" } 
    return {i: str(i) for i in range(n)} # from last listing in this chapter 


def inx(x,n): # do in front, middle, end, and not found 
    str(0) in x 
    str(n//2) in x 
    str(n-1) in x 
    str("a") in x # not in it 

timeList = Timer(
    "inx(x,n)", 
    "from __main__ import n,build_list,inx; x = build_list(n)") 

timeDict = Timer(
    "inx(x,n)", 
    "from __main__ import n,build_dict,inx; x = build_dict(n)") 

# get min of 5 runs of 5 
print("N", "\t", "List", "\t", "Dict") 
for size in range(1000, 100000+1, 5000): # sizes to graph for n: 
    n = size 
    list_secs = timeList.repeat(5,5) 
    dict_sect = timeDict.repeat(5,5) 
    print(n, "\t", min(list_secs), "\t", min(dict_sect)) 

На этот раз это время, сколько времени требуется, чтобы сделать в операторе и не дель оператор. Какие коды необходимо изменить и добавить?

+0

Эти тайминги для диктатора в течение некоторого времени немного вводят в заблуждение, так как время, затрачиваемое на построение каждой из тестируемых строк, является значительным по сравнению с выполнением поиска dict. Чтобы увидеть это, удалите 'in x' из каждой строки в' inx (x, n) '. Полученные времена для просто вызова функции 'inx()' и построения строк составляют примерно 50% времени для выполнения полного теста. –

+0

Хмм, я вижу, но связано ли это с тем, как в операторе? – devacris14

+0

Да и нет. :) Вышеприведенный код, безусловно, показывает, что 'in' намного быстрее на dicts, чем на списки того же размера. Но времена, о которых он сообщает, не являются «нулями» в операции 'in' - эти времена также включают время, которое требуется для вызова самой функции' inx() ', плюс время, необходимое для построения 4 строк. И этот материал занимает примерно такое же количество времени, что и фактические операции 'in' на dict. Поэтому числа, которые печатаются в коде, не должны восприниматься как точное указание относительной разницы в скорости между выполнением 'in' в списке по сравнению с dict. –

ответ

0

Вам нужно реализовать del отдельно для списка и dict, так как список принимает целое число для индексации, а ваш словарь имеет строковые ключи. Поскольку мы не можем удалить элемент, который не существует в списке или dict, я пропустил эту часть.

from timeit import Timer 

def build_list(n): 
    return list(range(n)) # create list of 1 to n 


def build_dict(n): # build dict = { 0:"0", 1:"1", 2:"2", ... n:"n" } 
    return {i: str(i) for i in range(n)} # from last listing in this chapter 


def delx(x, n): # do in front, middle, end, and not found 
    if x is list: 
     del x[0] # deleting first element in list 
     del x[(n-1)//2] # middle element delete n-1 because 0-th element is already deleted 
     del x[-1] # last element delete 
    if x is dict: 
     del x[str(0)] # deleting first element in dict 
     del x[str((n-1)//2)] # deleting middle element from dict 
     del x[str((n-2)-1)] # last element delete n-2 because 0-th and middle element is already deleted 
     # str("a") in x # not in it 

timeList = Timer(
    "delx(x,n)", 
    "from __main__ import n,build_list,delx; x = build_list(n)") 

timeDict = Timer(
    "delx(x,n)", 
    "from __main__ import n,build_dict,delx; x = build_dict(n)") 

# get min of 5 runs of 5 
print("N", "\t", "List", "\t", "Dict") 
for size in range(1000, 100000+1, 5000): # sizes to graph for n: 
    n = size 
    list_secs = timeList.repeat(5,5) 
    dict_sect = timeDict.repeat(5,5) 
    print(n, "\t", min(list_secs), "\t", min(dict_sect)) 
+0

работает нормально. Я полагал, что это имеет какое-то отношение к del x. не было особенно 100%, что делать. Большое спасибо за то, что вы помогли мне, k4vin. – devacris14