gpt4 book ai didi

python - 为什么 'all' 实现比写 for 循环慢

转载 作者:行者123 更新时间:2023-12-04 12:44:37 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why is a `for` loop so much faster to count True values?

(5 个回答)


2年前关闭。




我得到一个列表,想知道是否所有元素都相同。
对于具有大量元素的列表,这些元素确实完全相同,转换为 set速度很快,但除此之外,提前退出列表的性能更好:

def are_all_identical_iterate(dataset):
first = dataset[0]
for data in dataset:
if data != first:
return False
return True

# versus

def are_all_identical_all(dataset):
return all(data == dataset[0] for data in dataset)
# or
def are_all_identical_all2(dataset):
return all(data == dataset[0] for data in iter(dataset))
# or
def are_all_identical_all3(dataset):
iterator = iter(dataset)
first = next(iterator)
return all(first == rest for rest in iterator)

NUM_ELEMENTS = 50000
testDataset = [1337] * NUM_ELEMENTS # all identical

from timeit import timeit
print(timeit("are_all_identical_iterate(testDataset)", setup="from __main__ import are_all_identical_iterate, testDataset", number=1000))
print(timeit("are_all_identical_all(testDataset)", setup="from __main__ import are_all_identical_all, testDataset", number=1000))


我的结果:
0.94 秒,
3.09 秒,
3.27 秒,
2.61 秒

for 循环花费的时间少于 all 的时间(3 倍)功能。 all函数应该是 same implementation .

到底是怎么回事?
我想知道为什么循环要快得多,为什么最后 3 个实现之间存在差异。最后一个实现应该少一个比较,因为迭代器删除了第一个元素,但这不应该有这种影响。

最佳答案

正如 this 中所建议的其他 SO 发布一个原因可能是:

The use of a generator expression causes overhead for constantly pausing and resuming the generator.



无论如何,我建议使用另两种看起来更快的方法 map :
def are_all_identical_map(dataset):
for x in map(lambda x: x == dataset[0], dataset):
if not x:
return False
return True

%%timeit
are_all_identical_map(testDataset)
#7.5 ms ± 64.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


%%timeit
(map(lambda x: x == dataset[0], dataset)) and True
#303 ns ± 13.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

关于python - 为什么 'all' 实现比写 for 循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57995771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com