我们看到,大年夜部分时光都花费在了 mandelperf_numba() 函数的第一行和最后一行上。最后一行有点复杂,让我们将它分为两部分来再次分析:
分析器输出变成:
- Timer unit:1e-06 s
- Total time:0.002002 s
- File:
- Function: mandelperf_numba at line 11
- Line # Hits Time Per Hit % Time Line Contents
- ==============================================================
- 11 def mandelperf_numba():
- 12 1 678 678.0 33.9 r1 = np.linspace(-2.0, 0.5, 26)
- 13 1 235 235.0 11.7 r2 = np.linspace(-1.0, 1.0, 21)
- 14 1 617 617.0 30.8 c3 = [complex(r, i) for r in r1 for i in r2]
- 15 1 472 472.0 23.6 return [mandel_numba(c) for c in c3]
我们可以看到,对函数 mandel_numba() 的调用仅花费了总时光的 1/4。残剩时光花在 mandelperf_numba()
函数上。花时光优化它是值得的。
再次应用 Numpy
应用 Cython 在这琅绫腔有太大年夜赞助,并且 Numba 不实用。摆脱词攀困境的一种办法是再次应用 Numpy。我们将以下代码调换为生成等效结不雅的 Numpy
代码。
Numba 似乎没什么赞助。Cython 代码运行速度快了约 5 倍:
- return [mandel_numba(complex(r, i)) for r in r1 for i in r2]
此代码构建了所谓的二维网格。它计算由 r1 和 r2 供给坐标的点的复数表示。点 Pij 的坐标为 r1[i] 和 r2[j]。Pij 经由过程复数 r1[i] +
1j*r2[j] 进行表示,个中特别常量 1j 表示单个虚数 i。
我们可以直接编写此计算的代码:
- @jit
- def mandelperf_numba_mesh():
- width = 26
- height = 21
- r1 = np.linspace(-2.0, 0.5, width)
- r2 = np.linspace(-1.0, 1.0, height)
- mandel_set = np.zeros((width,height), dtype=int)
- for i in range(width):
- for j in
推荐阅读
Aporeto是一家“云原生”的安然始创公司,旨在确保那些不受信的IT情况的安然性。该公司方才在A轮融资——也就是岁尾产品宣布之前——获得了>>>详细阅读
地址:http://www.17bianji.com/lsqh/35343.html
1/2 1