【发布时间】:2021-02-16 11:00:48
【问题描述】:
def f1(x):
for i in range(1, 100):
x *= 2
x /= 3.14159
x *= i**.25
return x
def f2(x):
for i in range(1, 100):
x *= 2 / 3.14159 * i**.25
return x
两个函数的计算完全相同,但 f1 的计算时间要长 3 倍,即使是 @numba.njit。是否可以让 Python 识别编译中的等价性,就像它以其他方式优化 dis 一样,例如丢弃未使用的作业?
注意,我知道浮点运算关心顺序,因此这两个函数的输出可能略有不同,但如果有任何更多对数组值的单独编辑更少准确,所以这将是一个二合一优化。
x = np.random.randn(10000, 1000)
%timeit f1(x.copy()) # 2.68 s ± 50.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit f2(x.copy()) # 894 ms ± 36.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit njit(f1)(x.copy()) # 2.59 s ± 65.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit njit(f2)(x.copy()) # 901 ms ± 41.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
【问题讨论】:
-
这两个函数本质上是相同的,但是一个涉及三个向量运算,一个涉及一个。
-
@PranavHosangadi 我知道原因。
标签: python python-3.x compiler-optimization numba