gpt4 book ai didi

python - 制作无分支计数器的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 09:17:07 25 4
gpt4 key购买 nike

我正在为现场设备使用 Python3 中的计数器。它尝试联系设备并返回在线和离线的总数。

def count_online(mac_list):
online = 0
offline = 0

for mac in mac_list:

is_online = poll_device(mac) # ask the device if it is online, return bool

if is_online:
online += 1
else:
offline += 1

return online, offline
我见过“ Branchless method to convert false/true to -1/+1?”以及“ Why "If" is Sloowww”,但是我需要对在线和离线设备进行计数。我也很欣赏在 Python 中,尝试无分支可能有点毫无意义,因为它不是像 C 这样的低级语言。另一方面, Hopper Necklace提醒我们不要浪费我们的微秒,那么有没有更有效的方法来写这个?无分支方法会减少运行时间吗?

最佳答案

您可以简单地将 True 相加并从长度中减去它们 - 这将为您提供无分支代码:

def poll_device(_):
poll_device.state = not poll_device.state
return poll_device.state

poll_device.state = False

def count_online(mac_list):
online = 0
offline = 0
for mac in mac_list:
online += poll_device(mac) # ask the device if it is online, return bool

return online, len(mac_list)-online

on,off = count_online(range(10))

print(on,off)

import dis

dis.dis(count_online)
输出:
5 5

# disassembly
9 0 LOAD_CONST 1 (0)
2 STORE_FAST 1 (online)

10 4 LOAD_CONST 1 (0)
6 STORE_FAST 2 (offline)

11 8 SETUP_LOOP 24 (to 34)
10 LOAD_FAST 0 (mac_list)
12 GET_ITER
>> 14 FOR_ITER 16 (to 32)
16 STORE_FAST 3 (mac)

12 18 LOAD_FAST 1 (online)
20 LOAD_GLOBAL 0 (poll_device)
22 LOAD_FAST 3 (mac)
24 CALL_FUNCTION 1
26 INPLACE_ADD
28 STORE_FAST 1 (online)
30 JUMP_ABSOLUTE 14
>> 32 POP_BLOCK

14 >> 34 LOAD_FAST 1 (online)
36 LOAD_GLOBAL 1 (len)
38 LOAD_FAST 0 (mac_list)
40 CALL_FUNCTION 1
42 LOAD_FAST 1 (online)
44 BINARY_SUBTRACT
46 BUILD_TUPLE 2
48 RETURN_VALUE
与您的代码反汇编相比:
 21           0 LOAD_CONST               1 (0)
2 STORE_FAST 1 (online)

22 4 LOAD_CONST 1 (0)
6 STORE_FAST 2 (offline)

24 8 SETUP_LOOP 42 (to 52)
10 LOAD_FAST 0 (mac_list)
12 GET_ITER
>> 14 FOR_ITER 34 (to 50)
16 STORE_FAST 3 (mac)

26 18 LOAD_GLOBAL 0 (poll_device)
20 LOAD_FAST 3 (mac)
22 CALL_FUNCTION 1
24 STORE_FAST 4 (is_online)

28 26 LOAD_FAST 4 (is_online)
28 POP_JUMP_IF_FALSE 40

29 30 LOAD_FAST 1 (online)
32 LOAD_CONST 2 (1)
34 INPLACE_ADD
36 STORE_FAST 1 (online)
38 JUMP_ABSOLUTE 14

31 >> 40 LOAD_FAST 2 (offline)
42 LOAD_CONST 2 (1)
44 INPLACE_ADD
46 STORE_FAST 2 (offline)
48 JUMP_ABSOLUTE 14
>> 50 POP_BLOCK

33 >> 52 LOAD_FAST 1 (online)
54 LOAD_FAST 2 (offline)
56 BUILD_TUPLE 2
58 RETURN_VALUE

但我不太确定这种事先进行的“优化”是否明智 - 我只会选择 if ... else ...方法,直到此代码部分成为瓶颈(测量它)...对 poll_device(mac) 的调用比这个无分支结构慢 100-1000 倍,这会影响你的表现。

关于python - 制作无分支计数器的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63169687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com