python中if的用法 t_python – 在’if’子句中使用’in’时元组或列表?

CPython解释器用第一个替换第二个表单。

这是因为从常量加载元组是一个操作,但是列表将是3个操作;加载两个整数内容并构建一个新的列表对象。

因为您正在使用不可达到的列表文字,而是替换一个元组:

>>> import dis

>>> dis.dis(compile('number in [1, 2]', '', 'eval'))

1 0 LOAD_NAME 0 (number)

3 LOAD_CONST 2 ((1, 2))

6 COMPARE_OP 6 (in)

9 RETURN_VALUE

在这里,第二个字节码将一个(1,2)元组作为一个常量加载。与创建在成员身份测试中未使用的列表对象进行比较:

>>> dis.dis(compile('[1, 2]', '', 'eval'))

1 0 LOAD_CONST 0 (1)

3 LOAD_CONST 1 (2)

6 BUILD_LIST 2

9 RETURN_VALUE

这里需要N个长度为N的列表对象的步骤。

这种替代是CPython特有的窥视孔优化;请参阅Python/peephole.c source.对于其他Python实现,那么你想要坚持使用不可变对象。

也就是说,使用Python 3.2及以上版本的最佳选择是使用set literal:

if number in {1, 2}:

因为窥视孔优化器将用frozenset()对象替代,而对集合的成员资格测试是O(1)常量操作:

>>> dis.dis(compile('number in {1, 2}', '', 'eval'))

1 0 LOAD_NAME 0 (number)

3 LOAD_CONST 2 (frozenset({1, 2}))

6 COMPARE_OP 6 (in)

9 RETURN_VALUE

这个优化在Python 3.2年被添加,但没有被转载到Python 2。

因此,Python 2优化程序不能识别此选项,并且从内容构建集合或结果的成本几乎保证比使用元组进行测试的成本更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值