gpt4 book ai didi

Python [] 至少比 list() 快 3 倍?

转载 作者:太空狗 更新时间:2023-10-29 16:59:41 27 4
gpt4 key购买 nike

似乎在生成器表达式 (test1) 周围使用 [] 比将它放在 list() (test2) 中表现得更好。当我只是将列表传递到 list() 以进行浅拷贝(test3)时,速度并不存在。这是为什么?

证据:

from timeit import Timer

t1 = Timer("test1()", "from __main__ import test1")
t2 = Timer("test2()", "from __main__ import test2")
t3 = Timer("test3()", "from __main__ import test3")

x = [34534534, 23423523, 77645645, 345346]

def test1():
[e for e in x]

print t1.timeit()
#0.552290201187


def test2():
list(e for e in x)

print t2.timeit()
#2.38739395142

def test3():
list(x)

print t3.timeit()
#0.515818119049

机器:64 位 AMD、Ubuntu 8.04、Python 2.7 (r27:82500)

最佳答案

好吧,我的第一步是独立设置这两个测试,以确保这不是例如定义函数的顺序。

>python -mtimeit "x=[34534534, 23423523, 77645645, 345346]" "[e for e in x]"
1000000 loops, best of 3: 0.638 usec per loop

>python -mtimeit "x=[34534534, 23423523, 77645645, 345346]" "list(e for e in x)"
1000000 loops, best of 3: 1.72 usec per loop

果然,我可以复制这个。好的,下一步是查看字节码以了解实际情况:

>>> import dis
>>> x=[34534534, 23423523, 77645645, 345346]
>>> dis.dis(lambda: [e for e in x])
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x0000000001F8B330, file "<stdin>", line 1>)
3 MAKE_FUNCTION 0
6 LOAD_GLOBAL 0 (x)
9 GET_ITER
10 CALL_FUNCTION 1
13 RETURN_VALUE
>>> dis.dis(lambda: list(e for e in x))
1 0 LOAD_GLOBAL 0 (list)
3 LOAD_CONST 0 (<code object <genexpr> at 0x0000000001F8B9B0, file "<stdin>", line 1>)
6 MAKE_FUNCTION 0
9 LOAD_GLOBAL 1 (x)
12 GET_ITER
13 CALL_FUNCTION 1
16 CALL_FUNCTION 1
19 RETURN_VALUE

请注意,第一个方法直接创建列表,而第二个方法创建一个 genexpr 对象并将其传递给全局 list。这可能是开销所在。

另请注意,差异大约为一微秒,即完全微不足道。


其他有趣的数据

这仍然适用于非平凡列表

>python -mtimeit "x=range(100000)" "[e for e in x]"
100 loops, best of 3: 8.51 msec per loop

>python -mtimeit "x=range(100000)" "list(e for e in x)"
100 loops, best of 3: 11.8 msec per loop

对于不那么琐碎的 map 函数:

>python -mtimeit "x=range(100000)" "[2*e for e in x]"
100 loops, best of 3: 12.8 msec per loop

>python -mtimeit "x=range(100000)" "list(2*e for e in x)"
100 loops, best of 3: 16.8 msec per loop

并且(尽管不太强烈)如果我们过滤列表:

>python -mtimeit "x=range(100000)" "[e for e in x if e%2]"
100 loops, best of 3: 14 msec per loop

>python -mtimeit "x=range(100000)" "list(e for e in x if e%2)"
100 loops, best of 3: 16.5 msec per loop

关于Python [<generator expression>] 至少比 list(<generator expression>) 快 3 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4402858/

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