Python判断奇偶数

几个Python在编译器中的自动优化

先来看一段Jupyter里写的代码

import random
big_num = 9999999
test_obj = [random.randint(-big_num,big_num) for i in range(big_num)]
%%time
res0 = []
for i in test_obj:
    res0.append(i%2 ==1)
CPU times: user 1.48 s, sys: 55.9 ms, total: 1.53 s
Wall time: 1.53 s
%%time
res1 = []
for i in test_obj:
    res1.append(i&0x1==1)
CPU times: user 1.76 s, sys: 24 ms, total: 1.78 s
Wall time: 1.79 s
%%time
res2 = list(map(lambda x:x&0x1==1,test_obj))
CPU times: user 1.33 s, sys: 28 ms, total: 1.36 s
Wall time: 1.36 s
%%time
res3 = [i&0x1==1 for i in test_obj]
CPU times: user 885 ms, sys: 24 ms, total: 909 ms
Wall time: 912 ms
res0==res1==res2==res3
True

结论

在蟒蛇语中:

  1. 对int类型除二是有自动优化的,甚至%2比位运算&0x1更快.
  2. 在对列表做操作时,使用lambda之类的内嵌表达式比循环效率更高.
  3. 取余运算结果都是正数.
  4. ==运算符可以连续使用.

我的观点(不保证正确):

  1. 真正的Pythonic不用考虑考虑位运算之类的骚操作,就像sort快得像龙卷风一样,用就好好用,别想那么多.除非你是想研究或者设计这个语言.
  2. python是解释型的,所以一般情况下当你手动的帮它坍缩算法的复杂度和可能性时,就能增加效率.(比如lambda)
  3. 上两条加起来:写Python应该专注于目标情景中向上的算法的简化,而不是目标情景中向下的算法的实现.
本文总字数: 825