gpt4 book ai didi

python - 两种相似方法之间获取可迭代长度的时间差

转载 作者:行者123 更新时间:2023-12-05 03:37:01 25 4
gpt4 key购买 nike

我想到了一些很奇怪的东西。目标是评估可迭代对象的长度。

python -m timeit --setup="x = range(1000)" "x=list(x);len(x)"

1000000 loops, best of 3: 1.82 usec per loop

python -m timeit --setup="x = range(1000)" "len(list(x))"

100000 loops, best of 3: 9.92 usec per loop

谁能解释第一种方法更快的原因?

我试图查看汇编指令,但这无助于理解这种行为。

使用:x=list(x);len(x)

>>> dis.dis(meth1)
2 0 LOAD_GLOBAL 0 (list)
2 LOAD_FAST 0 (it)
4 CALL_FUNCTION 1
6 STORE_FAST 1 (x)

3 8 LOAD_GLOBAL 1 (len)
10 LOAD_FAST 1 (x)
12 CALL_FUNCTION 1
14 RETURN_VALUE

使用len(list(x)):

>>> dis.dis(meth2)
2 0 LOAD_GLOBAL 0 (len)
2 LOAD_GLOBAL 1 (list)
4 LOAD_FAST 0 (it)
6 CALL_FUNCTION 1
8 CALL_FUNCTION 1
10 RETURN_VALUE

最佳答案

您必须考虑到 setup 只执行一次这一事实。

测试

--setup="x = range(1000)" "x=list(x);len(x)"

range 转换为 list 并将其存储回 x。下一次迭代,它已经是一个列表,因此无需再做任何事情。

如果将其更改为不同的变量名,差异应该消失:

--setup="x = range(1000)" "something=list(x);len(something)"

在另一个测试中

--setup="x = range(1000)" "len(list(x))"

x 仍然是一个range 并且需要被转换成一个 list 100000 次。

关于python - 两种相似方法之间获取可迭代长度的时间差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69480801/

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