python - 按位或 "|"与 Python 中两个正幂的加法 "+"

标签 python bitwise-operators

让我们考虑一下我想传递一组某些对象的状态的特定情况。为了方便和灵活(或者可能是任意的),我选择使用二进制状态,然后使用按位或“|”连接起来在我传递它们之前:

status_a = 0b1
status_b = 0b10
status_c = 0b100

statuses_to_pass = status_a | status_c  # 0b101

然后我意识到在这种情况下我也可以使用加法算术运算符“+”:

status_a | status_c == status_a + status_c  
#             0b101 == 0b101  -->  True

当然,当状态是两个的正幂时,这是正确的;还有一些其他注意事项,例如:

status_a | status_c | status_c == status_a + status_c + status_c  
#                        0b101 == 0b1001  -->  False

但让我们假设我不超出限制 - 是否有任何理由说明按位运算符比算术运算符更好? Python 引擎盖下的东西?哪个更快?或者可能还有其他我没有想到的副作用?

最佳答案

timeit 的实验表明在这些情况下添加速度更快:

import timeit
import statistics
times = {"+": [], "|": []}

for x in range(10):
    for y in range(x+1, 10):
        for op in "+|":
            t = timeit.timeit(stmt="x {} y".format(op), setup="x=2**{};y=2**{}".format(x, y))
            times[op].append(t)


statistics.mean(times["+"])  # 0.029464346377385986
statistics.mean(times["|"])  # 0.04432822428643703

关于python - 按位或 "|"与 Python 中两个正幂的加法 "+",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55498263/

相关文章:

python - 需要帮助从 csv 中提取数据并写入文本文件

python numpy 在起始值和结束值之间呈指数间隔的样本

python - 如何根据索引向量求和

python - 从字典列表中以 pythonic 方式获取每个键值的最大长度

python - PIL/urllib2 - 使用 StringIO 传递文件时无法识别图像文件

javascript - 为什么 asm.js 会降低性能?

c++ - C++ 中的按位与

java - 优化Java中的128位序列按位运算

bit-manipulation - 如何仅使用按位运算符关闭一些位而忽略其他位

C 二元运算符 & (-1)