gpt4 book ai didi

python - 在什么情况下在 python 上使用 Disassembly 有用?

转载 作者:太空宇宙 更新时间:2023-11-03 12:19:49 24 4
gpt4 key购买 nike

dis 模块可以有效地用于将 Python 方法、函数和类反汇编为低级解释器指令。

我知道dis信息可以用于:
1. 在使用线程的程序中查找竞争条件
2.寻找可能的优化

根据您的经验,您是否知道 Disassembly Python 功能可能有用的任何其他场景?

最佳答案

dis这很有用,例如,当您使用不同的代码执行相同的操作并且您想知道性能差异在哪里时。

示例:list += [item]对比list.append(item)

def f(x): return 2*x

def f1(func, nums):
result = []
for item in nums:
result += [fun(item)]
return result

def f2(func, nums):
result = []
for item in nums:
result.append(fun(item))
return result

timeit.timeitf2(f, range(100))大约是 f1(f, range(100) 的两倍.为什么?

(有趣的是 f2map(f, range(100)) 大致一样快。)

f1

您可以通过调用 dis.dis(f1) 查看 dis 的全部输出,这里是第 4 行。

  4          19 LOAD_FAST                2 (result)
22 LOAD_FAST 1 (fun)
25 LOAD_FAST 3 (item)
28 CALL_FUNCTION 1
31 BUILD_LIST 1
34 INPLACE_ADD
35 STORE_FAST 2 (result)
38 JUMP_ABSOLUTE 13
>> 41 POP_BLOCK

f2

同样,这里只有第 4 行:

  4          19 LOAD_FAST                2 (result)
22 LOAD_ATTR 0 (append)
25 LOAD_FAST 1 (fun)
28 LOAD_FAST 3 (item)
31 CALL_FUNCTION 1
34 CALL_FUNCTION 1
37 POP_TOP
38 JUMP_ABSOLUTE 13
>> 41 POP_BLOCK

找出不同

f1我们需要:

  • 调用funitem (操作码 28)
  • 列出它(操作码 31,昂贵!)
  • 将其添加到 result (操作码 34)
  • 将返回值存储在result中(操作码 35)

f2 ,相反,我们只是:

  • 调用funitem (操作码 31)
  • 调用appendresult (操作码 34;C 代码:快!)

这解释了为什么(恕我直言)更具表现力 list += [value]list.append() 慢得多方法。


除此之外,dis.dis主要用于好奇心和尝试从 .pyc 中重构代码如果不花一大笔钱你就没有来源的文件:)

关于python - 在什么情况下在 python 上使用 Disassembly 有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676154/

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