gpt4 book ai didi

python timeit 没有在设置代码中初始化列表

转载 作者:太空宇宙 更新时间:2023-11-04 09:40:58 25 4
gpt4 key购买 nike

我正在计时从 python setlist 中删除元素。我的列表 timeit 代码引发了 ValueError: ... x not in list,但仅当我使用 timeit 运行不止一次迭代时才出现!??

看来,对于列表,设置代码中创建的变量在后续迭代中被重新使用(好像设置代码不是第二次运行??)。

这是我的代码:

In [1]: import timeit

In [2]: timeit.timeit(stmt='a.discard(10**5)', setup='a = set(range(10**6))', number=100000)
Out[2]: 0.02187999989837408

In [3]: timeit.timeit(stmt='a.remove(10**5)', setup='a = list(range(10**6))', number=1)
Out[3]: 0.023419374600052834

In [4]: timeit.timeit(stmt='a.remove(10**5)', setup='a = list(range(10**6))', number=2)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
...
ValueError: list.remove(x): x not in list

这是怎么回事??

最佳答案

他们的关键点是 setup 只执行 一次 即使 number 是 >1(因此 ValueError 当您尝试使用已从列表中删除的唯一值调用 list.remove 时)。来自docs (强调我的):

Time number executions of the main statement. This executes the setup statement once, and then returns the time it takes to execute the main statement a number of times, measured in seconds as a float. The argument is the number of times through the loop, defaulting to one million. The main statement, the setup statement and the timer function to be used are passed to the constructor.

所以,如果你想像这样对一个代码片段执行多次计时(比如获得更准确的计时),那么你必须使用 number=1,但你可以使用 timeit.repeat() 代替 repeat 参数:

>>> timeit.repeat(stmt='a.remove(10**5)', setup='a = list(range(10**6))', number=1, repeat=2)
[0.002321417909115553, 0.0023121219128370285]

关于python timeit 没有在设置代码中初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51749631/

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