Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么a=a*100几乎比a*100快两倍?_Python_Numpy - Fatal编程技术网

Python 为什么a=a*100几乎比a*100快两倍?

Python 为什么a=a*100几乎比a*100快两倍?,python,numpy,Python,Numpy,以下是关于和的问题(“为什么你认为aaa*=200比aaa=aaa*200?”),我在Jupyter笔记本中测试了它: %%timeit aaa = np.arange(1,101,1) aaa*=100 %%timeit aaa = np.arange(1,101,1) aaa=aaa*100 我很惊讶,因为第一个测试比第二个测试长:分别是1530ns和952ns。为什么这些值如此不同?TL;DR:这个问题相当于inplace\u binop(inplace\u*)(aaa

以下是关于和的问题(“为什么你认为
aaa*=200
aaa=aaa*200
?”),我在Jupyter笔记本中测试了它:

%%timeit aaa = np.arange(1,101,1)
    aaa*=100

%%timeit aaa = np.arange(1,101,1)
    aaa=aaa*100

我很惊讶,因为第一个测试比第二个测试长:分别是1530ns和952ns。为什么这些值如此不同?

TL;DR:这个问题相当于inplace\u binop(inplace\u*)
(aaa*=100)
binop(BINARY\u*)
(aaa=aaa*100)
之间的性能差异。使用
dis
模块可以发现差异:

将numpy导入为np
进口dis
aaa=np.arange(1101,1)
dis.dis(“”)
对于范围内的i(1000000):
aaa*=100
''')
dis.dis(“”)
对于范围内的i(1000000):
aaa=aaa*100
''')
然后回到你的问题,哪一个绝对更快?

不幸的是,很难说哪个函数更快,原因如下:

您可以直接检查代码。如果对CPython代码进行一点跟踪,函数调用的区别如下:

  • 就地查看->编译器分配->编译器访问
  • binop->编译器访问\u expr1->编译器访问\u expr->编译器访问\u kwonlydefaults
由于函数调用和逻辑是不同的,这意味着有很多因素(包括输入大小(*)、CPU…等)也可能影响性能,因此您需要根据您的用例进行分析以优化代码


*:从其他人的评论中,您可以检查以了解不同输入大小的性能。

20世纪70年代C语言中出现的+=符号,以及-与“智能汇编程序”的C思想对应的是明显不同的机器指令和寻址模式

“a=a*100”“a*=100”产生相同的效果,但在低级别对应于处理器的不同工作方式

a*=100
表示

  • 找到一个由
  • 乘以100
a=a*100
表示:

  • 评估a*100
  • 找到一个由
  • 将数据复制到累加器中
  • 用100乘以累加器
  • 将结果存储在
  • 找到一个由
  • 将累加器复制到它

Python是用C语言编写的,它继承了C语言的语法,但是由于在解释语言中执行之前没有翻译/优化,所以事情不一定如此密切相关(因为少了一个解析步骤)。但是,解释器可以为三种类型的表达式引用不同的执行例程,利用不同的机器代码,具体取决于表达式的形成方式和计算上下文。

如果在此处颠倒顺序,结果是什么?这与numpy有关。可能有关联?将范围更改为
np.arange(110001,1)
实际上会反转结果:
aaa*=100
更快!因此,随着输入大小的增加,就地的速度会更快。对于小型阵列,出于某种原因,创建新阵列更有效…@MaPy我认为您没有抓住要点。分配新阵列的速度更快…非常感谢大家!!!我没想到我的问题会把我带到这么远。我将尝试理解这个非常有趣的答案。谢谢你的回答。我开始学习python(我来自C世界),看到python字节码非常有趣。你让我发现了dis模块。我想知道是否有可能深入一点。例如,在asm代码?@Stef1611之前,缺少的拼图包括字节码和VM,您可以首先参考和了解详细信息。要进一步了解,请考虑。非常感谢。我想我会被占用几天或几个月。。。但是非常有趣。
  3          14 LOAD_NAME                2 (aaa)
             16 LOAD_CONST               1 (100)
             18 INPLACE_MULTIPLY
             20 STORE_NAME               2 (aaa)
             22 JUMP_ABSOLUTE           10
        >>   24 POP_BLOCK
        >>   26 LOAD_CONST               2 (None)
             28 RETURN_VALUE
  3          14 LOAD_NAME                2 (aaa)
             16 LOAD_CONST               1 (100)
             18 BINARY_MULTIPLY
             20 STORE_NAME               2 (aaa)
             22 JUMP_ABSOLUTE           10
        >>   24 POP_BLOCK
        >>   26 LOAD_CONST               2 (None)
             28 RETURN_VALUE