gpt4 book ai didi

python - 为什么 [] 比 list() 快?

转载 作者:行者123 更新时间:2023-12-05 07:49:56 25 4
gpt4 key购买 nike

我最近比较了[]的处理速度和 list()并惊讶地发现[]list() 运行快三倍 .我用 {} 运行了相同的测试和 dict()结果几乎相同:[]{}两者都花费了大约 0.128 秒/百万个周期,而 list()dict()每个周期大约需要 0.428 秒/百万次。

这是为什么?做[]{} (可能还有 ()'' )立即传回一些空库存文字的副本,而它们明确命名的副本( list()dict()tuple()str() )完全着手创建一个对象,它们是否真的有元素?

我不知道这两种方法有何不同,但我很想知道。我无法在文档或 SO 上找到答案,结果发现搜索空括号比我预期的更成问题。

我通过调用 timeit.timeit("[]") 获得了计时结果和 timeit.timeit("list()") , 和 timeit.timeit("{}")timeit.timeit("dict()") , 分别比较列表和字典。我正在运行 Python 2.7.9。

我最近发现“Why is if True slower than if 1?”比较了if True的性能至 if 1并且似乎触及了类似的文字与全局情景;或许也值得考虑。

最佳答案

因为 []{}文字语法。 Python 可以创建字节码来创建列表或字典对象:

>>> import dis
>>> dis.dis(compile('[]', '', 'eval'))
1 0 BUILD_LIST 0
3 RETURN_VALUE
>>> dis.dis(compile('{}', '', 'eval'))
1 0 BUILD_MAP 0
3 RETURN_VALUE

list()dict() 是独立的对象。它们的名称需要解析,堆栈必须参与推送参数,帧必须存储以便稍后检索,并且必须进行调用。这一切都需要更多时间。

对于空的情况,这意味着你至少有一个 LOAD_NAME (必须搜索全局命名空间以及 builtins module )后跟 CALL_FUNCTION ,它必须保留当前帧:

>>> dis.dis(compile('list()', '', 'eval'))
1 0 LOAD_NAME 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
>>> dis.dis(compile('dict()', '', 'eval'))
1 0 LOAD_NAME 0 (dict)
3 CALL_FUNCTION 0
6 RETURN_VALUE

您可以使用 timeit 分别为名称查找计时:

>>> import timeit
>>> timeit.timeit('list', number=10**7)
0.30749011039733887
>>> timeit.timeit('dict', number=10**7)
0.4215109348297119

时间不一致可能是字典哈希冲突。从调用这些对象的时间中减去这些时间,并将结果与​​使用文字的时间进行比较:

>>> timeit.timeit('[]', number=10**7)
0.30478692054748535
>>> timeit.timeit('{}', number=10**7)
0.31482696533203125
>>> timeit.timeit('list()', number=10**7)
0.9991960525512695
>>> timeit.timeit('dict()', number=10**7)
1.0200958251953125

因此,每 1000 万次调用需要额外的 1.00 - 0.31 - 0.30 == 0.39 秒。

您可以通过将全局名称别名为本地名称来避免全局查找成本(使用 timeit 设置,绑定(bind)到名称的所有内容都是本地名称):

>>> timeit.timeit('_list', '_list = list', number=10**7)
0.1866450309753418
>>> timeit.timeit('_dict', '_dict = dict', number=10**7)
0.19016098976135254
>>> timeit.timeit('_list()', '_list = list', number=10**7)
0.841480016708374
>>> timeit.timeit('_dict()', '_dict = dict', number=10**7)
0.7233691215515137

但您永远无法克服 CALL_FUNCTION 成本。

关于python - 为什么 [] 比 list() 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36712917/

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