设计一个实验来比较 del 运算符在列表和字典上的性能

Devise an experiment that compares the performance of the del operator on lists and dictionaries

我目前正在做 Problem Solving with Algorithms and Data Structures

所以我在这里进行第 3 个问题的编程练习,因为它说设计一个实验来比较 del 运算符在列表和字典上的性能。

这是我的解决方案:

3) Devise an experiment that compares the performance of the del operator on lists and dictionaries.

1) 列表:

def listitems(lis):

    del(lis[16])
    return lis

def time_taken(n):

    start_time = time.time()
    result = n
    end_time = time.time()
    return end_time - start_time, result

print time_taken(listitems([1,2,3,5,4,5,6,5,4,8,5,2,4,5,2,6,3,5,12,4,2,5,2,4,[1,5,4,5,4,54,5,5,6,4,5,[2,4,5,5,1,2,5]]]))

2) 词典

def dictionary(dic):

    del(dic["Topic"])
return dic

def time_taken(n):

    start_time = time.time()
    result = n
    end_time = time.time()
    return end_time - start_time, result

print time_taken(dictionary({"Name": "Pradeep", "Age": 23, "Learning": "Python", "Topic": "Big O Notation"}))

输出:

(0.0, [1, 2, 3, 5, 4, 5, 6, 5, 4, 8, 5, 2, 4, 5, 2, 6, 5, 12, 4, 2, 5, 2, 4, [1, 5, 4, 5, 4, 54, 5, 5, 6, 4, 5, [2, 4, 5, 5, 1, 2, 5]]])

(0.0, {'Age': 23, 'Name': 'Pradeep', 'Learning': 'Python'})

所以根据大O记法列表输出时间应该和字典输出时间不同

参考:Time Complexity

要检查函数的执行时间,建议使用 timeit

你方法中的问题是,当你调用 time_taken(listitems(values)) 时,你实际上是先执行 listitems 函数,然后将值传递给 time_taken 那么 time_taken 做了什么它是否显示了将给定变量存储在 result 中所花费的时间,因此您得到的时间相同

使用 timeit 模块:

timeit.timeit('lis = [1,2,3,5,4,5,6,5,4,8,5,2,4,5,2,6,3,5,12,4,2,5,2,4,[1,5,4,5,4,54,5,5,6,4,5,[2,4,5,5,1,2,5]]]; del(lis[16])', number=10000)
Out[41]: 0.0182793565268895

timeit.timeit('dic = {"Name": "Pradeep", "Age": 23, "Learning": "Python", "Topic": "Big O Notation"}; del(dic["Topic"])', number=10000)
Out[42]: 0.006386155956171535

所以很明显del对dic的操作比list

请查看有关测量 time taken by a function

的关于 SO 的问答

下面是我是如何实现的。结果显示字典上的 del 操作比列表中的更快。 代码是不言自明的。

import timeit
import random

def del_dict_items(x):
# Insert the index
    random_index = random.randrange(len(x) - 1)
    try:
        del x[random_index]
    except KeyError:
        x.setdefault(random_index, None)
        del x[random_index]

print("i\t\tlist_del_time\t\tdict_del_time")
for i in range(10000, 100001, 1000):
    t_list = timeit.Timer("del x[random.randrange(len(x)-1)]", "from __main__ import random, x")
    t_dict = timeit.Timer("del_dict_items(x)", "from __main__ import random, x, del_dict_items")
    x = list(range(i))
    list_del_time = t_list.timeit(number=1000)
    x = {j:None for j in range(i)}
    dict_del_time = t_dict.timeit(number=1000)
    print("%d %10.3f %20.3f" %(i, list_del_time, dict_del_time))