python更快吗_python – 为什么[]比list()更快?

本文探讨了Python中使用字面量语法创建列表和字典与通过调用`list()`和`dict()`函数的性能差异。通过`dis`模块分析字节码,显示字面量创建更快,因为函数调用涉及到更多的操作如堆栈管理和帧存储。时间测试进一步证实了这一点,函数调用在大量迭代中比直接使用字面量慢。即使在局部作用域中,调用函数的成本也无法完全消除。
摘要由CSDN通过智能技术生成

因为[]和{}是字面语法. 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(必须搜索全局命名空间以及__builtin__ 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秒.

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

>>> 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成本.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值