python - 为什么“not”运算符比 python 中的常规条件更快?
问题描述
我正在阅读一篇关于列表推导的文章,它提到列表推导比常规和嵌套的 for 循环更快。在阅读那篇文章时,它提到了这个声明
if expression % 2 == 0:
慢于
if not expression % 2:
任何人都可以解释这背后的原因吗?即使我正在解决树木问题,并且在递归中我使用的不是根类型的参数。因此,如果有人可以提供帮助,将不胜感激。
文章链接:https : //switowski.com/blog/for-loop-vs-list-comprehension 这里是简短的实现,感谢@Ted
>>> MILLION_NUMBERS = list(range(1_000_000))
>>> def for_loop():
... output = []
... for element in MILLION_NUMBERS:
... if not element % 2:
... output.append(element)
... return output
...
>>> def for_loop2():
... output = []
... for element in MILLION_NUMBERS:
... if element % 2 == 0:
... output.append(element)
... return output
...
>>> timeit.timeit(stmt=for_loop, number=100)
6.254316797000001
>>> timeit.timeit(stmt=for_loop2, number=100)
7.362754617999997
提前致谢。
解决方案
如果您在这两种情况下都使用反汇编程序,您会发现:
如果表达式 % 2 == 0:
2 0 LOAD_FAST 0 (x)
2 LOAD_CONST 1 (2)
4 BINARY_MODULO
6 LOAD_CONST 2 (0)
8 COMPARE_OP 2 (==)
10 POP_JUMP_IF_FALSE 20
如果不是表达式 % 2:
2 0 LOAD_FAST 0 (x)
2 LOAD_CONST 1 (2)
4 BINARY_MODULO
6 POP_JUMP_IF_TRUE 16
上面的示例必须再执行两次操作才能确定该值是否为零。这可能是本书作者所说的基础。实际上,这几乎没有任何区别,并且在 python 的实现中可能会有很大的不同。您也可以使用timeit模块来计时!
>>> timeit.timeit('5 % 2 == 0', number=10**7)
0.47088638799323235
>>> timeit.timeit('not 5 % 2', number=10**7)
0.1560280679987045
这会告诉你第二个比第一个快近 3 倍。
推荐阅读
- ansible - Ansible - 使用逻辑与“何时”停止跳过第二次评估
- javascript - 反应:如何从其父级更改子组件(功能组件,而不是类组件)的状态?
- java - 如何使用 Spring Data 和 Kafka 处理跨多个线程的事务
- python - 比较两个坐标列表并输出差异
- tensorflow - 使用 GPU 和 Keras 进行强化学习
- sql - 从具有多行相同id的表中获取每个id一行和多列的表,并根据条件计算总和
- excel - Excel 日期比较 + 对 ID 的依赖
- python - 我目前在将我的 Streamlit 应用程序部署到 Heroku 时遇到错误
- java - 解决protobuf java生成文件中的override编译错误
- python - 码头工人蟒蛇错误。urllib.error.URLError: