Python中的操作

Python中的操作,python,Python,我的问题相当基本,但可能需要一个具有挑战性的解决方案 本质上,我有一个任意函数,我们称之为某个函数 def some_function(n): for i in range(n): i+i r = 1 r = r+1 我想计算一下执行此函数的任意调用中发生的操作数(例如,some_函数(5)。发生了7个操作) 如何计算函数调用中发生的操作数?我无法使用以下方法修改某些函数: 示例: #!/usr/bin/env python from byte

我的问题相当基本,但可能需要一个具有挑战性的解决方案

本质上,我有一个任意函数,我们称之为某个函数

def some_function(n):
    for i in range(n):
           i+i
    r = 1
    r = r+1
我想计算一下执行此函数的任意调用中发生的操作数(例如,
some_函数(5)
。发生了7个操作)

如何计算函数调用中发生的操作数?我无法使用以下方法修改某些函数:

示例:

#!/usr/bin/env python


from byteplay import Code


def some_function(n):
    for i in range(n):
        i + i
    r = 1
    r = r + 1


def no_of_bytecode_instructions(f):
    code = Code.from_code(f.func_code)
    return len(code.code)


print(no_of_bytecode_instructions(some_function))
$ python -i foo.py
28
>>> 
输出:

#!/usr/bin/env python


from byteplay import Code


def some_function(n):
    for i in range(n):
        i + i
    r = 1
    r = r + 1


def no_of_bytecode_instructions(f):
    code = Code.from_code(f.func_code)
    return len(code.code)


print(no_of_bytecode_instructions(some_function))
$ python -i foo.py
28
>>> 
NB:

#!/usr/bin/env python


from byteplay import Code


def some_function(n):
    for i in range(n):
        i + i
    r = 1
    r = r + 1


def no_of_bytecode_instructions(f):
    code = Code.from_code(f.func_code)
    return len(code.code)


print(no_of_bytecode_instructions(some_function))
$ python -i foo.py
28
>>> 
  • 这仍然让你不知道这里的
    f
    有多复杂
  • “指令数”!=“算法复杂度”(并非自身)
  • 见:
算法复杂性是对执行指令数量的度量 相对于输入数据集的大小

一些简单的“复杂性”和:


我想你真的在追求别人已经告诉你的东西——大O符号

但如果您真的想知道实际执行的指令数,可以在linux上使用:

perf stat -e instructions:u python yourscript.py
这将输出:

“python yourscript.py”的性能计数器统计信息:

    22,260,577 instructions:u           

   0.014450363 seconds time elapsed

但请注意,它包含了执行python本身的所有指令。因此,您必须找到自己的参考。

什么是“操作”?
范围(n)
是操作吗?是
r+1
?请注意,
pass
是明显缺少操作;它编译为零。您是需要代码来计算,还是需要手工计算?操作的具体构成非常模糊,而且很难跟踪很多事情。您可能能够使用字节码解释器循环来计算执行的字节码指令,但这可能远远超出了您的知识范围。使用类似于
cProfile
的东西评测代码将为您提供有用的数据。可能不是你要找的那种,但可能比你要找的那种更有用。但是为什么呢?你想解决什么问题?你所要求的东西定义得非常糟糕。计算字节码或机器码操作的数量并不能让你了解算法的“复杂性”(参见:)--什么是“复杂性”(因此得名)--在你的例子中,这是
O(n)
。没有“操作”这样的东西
r=r+1
至少执行三条指令,这仅在CPython上执行。你可能会问,当你打开微波炉时,会发生多少次手术。真是个好发现!我来看看这个。另外,为什么不让我了解f的复杂性呢?因为“指令数”!=“算法复杂性”。请原谅我的天真,这是一条我还没有听说过的定律吗?虽然这是一个很好的工具,“函数中的指令数”和“执行的指令数”是非常不同的度量标准。我们所追求的是更接近运行时的指标,而不是代码长度。算法复杂性指的是相对于输入集的大小将执行多少条指令。这是一项非常有用和重要的措施。阅读他在Big O上的链接。感谢这个Jahaja,我会看看这个。