让我们创建一个函数来制作我们的条目列表。
def make_entries(size):
return [{'key': random.randint(1, size//2)} for _ in range(size)]
我们将使用它来创建不同大小的列表并测试每种方法的速度。
方法1:创建一个空集并添加到它
def add_to_set(entries):
myset = set()
for entry in entries:
myset.add(entry['key'])
return len(myset)
方法2:创建一个列表,然后用它来创建一个集合
def create_from_list(entries):
mylist = list()
for entry in entries:
mylist.append(entry['key'])
return len(set(mylist))
方法 2a:使用列表推导式创建列表,然后创建一个集合
def create_from_list_comprehension(entries):
return len(set([entry['key'] for entry in entries]))
方法 3:使用集合理解(@schwobaseggl 在他们的 comment 中的建议)
def set_comprehension(entries):
return len({entry['key'] for entry in entries})
接下来,我们可以针对size 的不同值对这些方法中的每一种进行计时。
sizes = [10, 50, 100, 500, 1_000, 5_000, 10_000, 50_000, 100_000]
times = []
for size in sizes:
times.append([])
entries = make_entries(size)
nrepeat = 1000
times[-1].append(timeit.timeit('add_to_set(entries)', setup='from __main__ import entries, add_to_set', number=nrepeat) / nrepeat)
times[-1].append(timeit.timeit('create_from_list(entries)', setup='from __main__ import entries, create_from_list', number=nrepeat) / nrepeat)
times[-1].append(timeit.timeit('create_from_list_comprehension(entries)', setup='from __main__ import entries, create_from_list_comprehension', number=nrepeat) / nrepeat)
times[-1].append(timeit.timeit('set_comprehension(entries)', setup='from __main__ import entries, set_comprehension', number=nrepeat) / nrepeat)
我在我的 Win10 笔记本电脑上使用 Python 3.7.7 运行了这个,print(sys.version) 给出了
3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit (AMD64)]
现在,如果我们绘制times,我们会发现使用集合推导始终比所有其他方法更快。
在您提出的两种方法之间,直接添加到集合通常比创建一个列表然后从该列表中创建一个集合要快,但速度并不快:平均大约快 1.2 倍。
如果你有兴趣,这些是我得到的times 的号码。列对应不同的方法,行对应不同的大小。
times = [[1.91180001e-06, 2.25380005e-06, 1.43129996e-06, 7.10900058e-07],
[4.31230001e-06, 6.94569992e-06, 3.65169998e-06, 2.49419990e-06],
[1.56470999e-05, 1.50408000e-05, 8.06160003e-06, 5.67660003e-06],
[6.51685999e-05, 7.41121001e-05, 6.79391000e-05, 4.49675000e-05],
[1.40047500e-04, 1.70246000e-04, 9.80658000e-05, 6.99476000e-05],
[8.01188900e-04, 1.00142830e-03, 4.92695100e-04, 5.36500400e-04],
[1.35429690e-03, 1.53512830e-03, 8.99595700e-04, 8.74221300e-04],
[8.91747430e-03, 1.10454779e-02, 8.46084390e-03, 7.77944500e-03],
[1.97166152e-02, 1.95640820e-02, 1.17698472e-02, 1.20813099e-02]]