(比较无与伦比永远是一把双刃剑。
下面的内容是出于公平的信念,应该将 LLVM / JIT 驱动的代码基准与其他一些 LLVM / JIT 驱动的替代方案进行比较,任何派生的结论都应作为合理支持的决策的基础。)
简介:(东西numba
和[我们]的结果在页面下方有点低)
恕我直言,julia-lang官方网站提供了一组性能测试列表,其中陈述了两类事实。第一个与性能测试的执行方式有关(julia,使用 LLVM 编译的代码执行 v/s python,仍然是 GIL 步进的解释代码执行)。二、其他语言完成同一个“benchmark-task”需要多长时间,以C编译代码执行为相对时间单位=1.0
带有结果的表格上方的章节标题说 (cit.:)
高性能 JIT 编译器
Julia 基于 LLVM 的即时 (JIT) 编译器与该语言的设计相结合,使其能够接近并经常匹配 C 的性能。
我认为比较苹果和苹果要更严格一些,只用了一个的“基准任务”-s,称为.
pi-sum
这是解释型 python 的第二个最差时间,它的运行速度比 LLVM/JIT 编译的 julia-code 或 C 编译的替代方案慢 21.99 倍。
于是小实验故事开始了。
@numba.jit( JulSUM, nogil = True )
:
让我们开始比较苹果和苹果。如果据报道 Julia 代码的运行速度提高了 22 倍,那么我们首先测量一个普通解释的 Python 代码运行。
>>> def JulSUM():
... sum = 0.
... j = 0
... while j < 500:
... j += 1
... sum = 0.
... k = 0
... while k < 10000:
... k += 1
... sum += 1. / ( k * k )
... return sum
...
>>> from zmq import Stopwatch
>>> aClk = Stopwatch()
>>> aClk.start();_=JulSUM();aClk.stop()
1271963L
1270088L
1279277L
1277371L
1279390L
1274231L
所以,核心pi-sum
运行大约 1.27x.xxx [us] ~ 大约 1.27~1.28 [s]
鉴于julia-lang网站上语言演示的表格行pi-sum
,LLVM/JIT 驱动的 julia 代码执行速度应该快 22 倍,即低于~ 57.92 [ms]
>>> 1274231 / 22
57919
因此,让我们使用numba.jit
(v24.0)将橙子转换为苹果
>>> import numba
>>> JIT_JulSUM = numba.jit( JulSUM )
>>> aClk.start();_=JIT_JulSUM();aClk.stop()
1175206L
>>> aClk.start();_=JIT_JulSUM();aClk.stop()
35512L
37193L
37312L
35756L
34710L
因此,在 JIT 编译器完成工作后,numba-LLVM'ed python 的基准测试时间约为 34.7 ~ 37.3 [ms]
我们能走得更远吗?
哦,当然,我们还没有做太多的numba
调整,虽然代码示例是如此微不足道,但预计不会有太多令人惊讶的进步。
首先,让我们删除这里不必要的 GIL 步进:
>>> JIT_NOGIL_JulSUM = numba.jit( JulSUM, nogil = True )
>>> aClk.start();_=JIT_NOGIL_JulSUM();aClk.stop()
85795L
>>> aClk.start();_=JIT_NOGIL_JulSUM();aClk.stop()
35526L
35509L
34720L
35906L
35506L
nogil=True
不会使执行更远,
但仍会减少一些 [ms],将所有结果驱动到 ~ 35.9 [ms]
>>> JIT_NOGIL_NOPYTHON_JulSUM = numba.jit( JulSUM, nogil = True, nopython = True )
>>> aClk.start();_=JIT_NOGIL_NOPYTHON_JulSUM();aClk.stop()
84429L
>>> aClk.start();_=JIT_NOGIL_NOPYTHON_JulSUM();aClk.stop()
35779L
35753L
35515L
35758L
35585L
35859L
nopython=True
只做最后的润色
,以使所有结果始终保持在 ~ 35.86 [ms](相对于 LLVM/JIT-julia 的 ~57.92 [ms] )
DSP处理的结语:
对于关于加速 DSP 处理的额外好处的 OP 问题,
可以尝试测试numba
+英特尔 Python(通过 Anaconda),英特尔在二进制文件中开辟了新视野,针对 IA64 处理器内部性进行了优化,因此代码-基于英特尔对 ILP4 的了解、向量化和分支预测详细信息,他们自己的 CPU 在运行时展示的执行可能会享受额外的 CPU 绑定技巧。值得一试来比较这一点(另外一个人可能会喜欢他们集成到 VisualStudio 中的非破坏性代码分析工具,其中可以实时分析体外代码执行热点——这是 DSP 工程师会喜欢的东西,他/她不会吗?