通常,使用Cython时,我能够与Numba媲美。但是,在此示例中,我没有这样做-Numba比我的Cython版本快4倍。
以下是Cython版本:
%%cython -c=-march=native -c=-O3
cimport numpy as np
import numpy as np
cimport cython
@cython.boundscheck(False)
@cython.wraparound(False)
def cy_where(double[::1] df):
cdef int i
cdef int n = len(df)
cdef np.ndarray[dtype=double] output = np.empty(n, dtype=np.float64)
for i in range(n):
if df[i]>0.5:
output[i] = 2.0*df[i]
else:
output[i] = df[i]
return output
这是Numba版本:
import numba as nb
@nb.njit
def nb_where(df):
n = len(df)
output = np.empty(n, dtype=np.float64)
for i in range(n):
if df[i]>0.5:
output[i] = 2.0*df[i]
else:
output[i] = df[i]
return output
经过测试,Cython版本与numpy的版本相当where
,但明显不及Numba:
#Python3.6 + Cython 0.28.3 + gcc-7.2
import numpy
np.random.seed(0)
n = 10000000
data = np.random.random(n)
assert (cy_where(data)==nb_where(data)).all()
assert (np.where(data>0.5,2*data, data)==nb_where(data)).all()
%timeit cy_where(data) # 179ms
%timeit nb_where(data) # 49ms (!!)
%timeit np.where(data>0.5,2*data, data) # 278 ms
Numba性能的原因是什么?在使用Cython时如何匹配?
正如@ max9111所建议的那样,通过使用连续的内存视图消除了跨步,但这并不能显着提高性能:
@cython.boundscheck(False)
@cython.wraparound(False)
def cy_where_cont(double[::1] df):
cdef int i
cdef int n = len(df)
cdef np.ndarray[dtype=double] output = np.empty(n, dtype=np.float64)
cdef double[::1] view = output # view as continuous!
for i in range(n):
if df[i]>0.5:
view[i] = 2.0*df[i]
else:
view[i] = df[i]
return output
%timeit cy_where_cont(data) # 165 ms
这似乎完全由LLVM能够进行的优化驱动。如果我用clang编译cython示例,则两个示例之间的性能是相同的。就其价值而言,Windows上的MSVC表现出与numba类似的性能差异。
$ CC=clang ipython
<... setup code>
In [7]: %timeit cy_where(data) # 179ms
...: %timeit nb_where(data) # 49ms (!!)
30.8 ms ± 309 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
30.2 ms ± 498 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Numba 是 Cython 的竞争项目。同样地,numba 把 Python 源码通过 LLVMPy 生成 JIT 后的 .so 文件来加速。 不同点: numba 是以 JIT 为主的,加速对源码的侵入性较小。 Cython 则重点在加速高性能 Python 模块的开发上,不依赖 LLVMPy 项目。 numba 还很不成熟,目前兼容性相当差。 Numba 是 Anaconda,Inc. 赞助
本文向大家介绍pyx文件 生成pyd 文件用于 cython调用的实现,包括了pyx文件 生成pyd 文件用于 cython调用的实现的使用技巧和注意事项,需要的朋友参考一下 pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,“语法错误”。 上面的pyx文件还仅仅是源代码文件,要想
准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而Cython有专门的“编译器”先将 Cython代码转变成C(自动加入了一大堆的C-Python API),然后使用C编译器编译出最终的Python可调用的模块。
本文向大家介绍Python爬取三国演义的实现方法,包括了Python爬取三国演义的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文的爬虫教程分为四部: 1.从哪爬 where 2.爬什么 what 3.怎么爬 how 4.爬了之后信息如何保存 save 一、从哪爬 三国演义 二、爬什么 三国演义全文 三、怎么爬 在Chrome页面打开F12,就可以发现
本文向大家介绍DevExpress之ChartControl实现柱状图演示实例,包括了DevExpress之ChartControl实现柱状图演示实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了DevExpress中ChartControl实现柱状图演示的方法。分享给大家供大家参考。具体实现方法如下: 关键代码如下: 运行效果如下图所示: 希望本文所述对大家的C#程序设计有所帮助。
本文向大家介绍numba提升python运行速度的实例方法,包括了numba提升python运行速度的实例方法的使用技巧和注意事项,需要的朋友参考一下 大家都知道Python运行速度很慢,但是轮子多,因此用户十分广泛,在各种领域上都能用到Python,但是最头疼的还是,解决运行速度问题,因此这里给大家介绍的是numba,是基本是等于再造语言。但是支持的numpy函数并不多。要让能jit的函数多起来