我最近在玩timeit和Python的指数时最近观察到了相当多的怪异。
首先,知道math.sin(1)==(e ** 1j).imag,我很好奇……
您可以通过查看CPython生成的字节码来解释您的观察结果 DIS 模块。让我们来看看。
******************************************************************************** from match import sin; sin(1) 1 0 LOAD_CONST 0 (0) 2 LOAD_CONST 1 (('sin',)) 4 IMPORT_NAME 0 (match) 6 IMPORT_FROM 1 (sin) 8 STORE_NAME 1 (sin) 10 POP_TOP 12 LOAD_NAME 1 (sin) 14 LOAD_CONST 2 (1) 16 CALL_FUNCTION 1 18 POP_TOP 20 LOAD_CONST 3 (None) 22 RETURN_VALUE ******************************************************************************** from math import e; (e**1j).imag 1 0 LOAD_CONST 0 (0) 2 LOAD_CONST 1 (('e',)) 4 IMPORT_NAME 0 (math) 6 IMPORT_FROM 1 (e) 8 STORE_NAME 1 (e) 10 POP_TOP 12 LOAD_NAME 1 (e) 14 LOAD_CONST 2 (1j) 16 BINARY_POWER 18 LOAD_ATTR 2 (imag) 20 POP_TOP 22 LOAD_CONST 3 (None) 24 RETURN_VALUE ******************************************************************************** from cmath import exp; exp(1j).imag 1 0 LOAD_CONST 0 (0) 2 LOAD_CONST 1 (('exp',)) 4 IMPORT_NAME 0 (cmath) 6 IMPORT_FROM 1 (exp) 8 STORE_NAME 1 (exp) 10 POP_TOP 12 LOAD_NAME 1 (exp) 14 LOAD_CONST 2 (1j) 16 CALL_FUNCTION 1 18 LOAD_ATTR 2 (imag) 20 POP_TOP 22 LOAD_CONST 3 (None) 24 RETURN_VALUE ******************************************************************************** (2.718281828459045**1j).imag 1 0 LOAD_CONST 0 ((0.5403023058681398+0.8414709848078965j)) 2 LOAD_ATTR 0 (imag) 4 RETURN_VALUE
如您所见,您的最后一个示例非常快,因为解释器在创建字节码时将值转换为常量。除了拨打电话之外,你实际上并没有在上一次做任何工作 imag 。
imag