Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cython vs PythonNumpy用于(简单地)添加数组_Python_Numpy_Cython - Fatal编程技术网

cython vs PythonNumpy用于(简单地)添加数组

cython vs PythonNumpy用于(简单地)添加数组,python,numpy,cython,Python,Numpy,Cython,如果已经回答了类似的问题,那么很抱歉。下面是我问题的一个简化示例: test函数调用test_helper,它只对numpy输入执行一些操作 我希望用cython重写test_helper以获得速度增益;限制是一个test,test_helper需要是单独的函数(没有内联func)(它们在实际代码中位于单独的文件中)。但是,可以将输入更改为test\u helper 纯python #np#u test_py.py 将numpy作为np导入 def测试辅助程序(a、b、c): d=a+b-c 返

如果已经回答了类似的问题,那么很抱歉。下面是我问题的一个简化示例: test函数调用test_helper,它只对
numpy
输入执行一些操作

我希望用cython重写test_helper以获得速度增益;限制是一个test,test_helper需要是单独的函数(没有内联func)(它们在实际代码中位于单独的文件中)。但是,可以将输入更改为test\u helper

纯python
#np#u test_py.py
将numpy作为np导入
def测试辅助程序(a、b、c):
d=a+b-c
返回d
def测试(a、b、c):
对于范围内的i(150000):
测试助手(a、b、c)
迄今为止最好的赛昂
#np#u test.pyx
将numpy作为np导入
cimport numpy作为np
西姆波特赛顿酒店
@cython.boundscheck(错误)
@cython.wrapparound(假)
cdef测试辅助程序(np.float64_t[:1]a,np.float64_t[:1]b,np.float64_t[:1]c):
cdef:
int k
np.ndarray[np.float64_t,ndim=1]d=np.zeros(2000,dtype=np.float64)
np.float64\u t[::1]d\u view=d
对于X范围内的k(2000年):
d_视图[k]=(a[k]+b[k]-c[k])
返回d
def测试(a、b、c):
对于范围内的i(150000):
测试助手(a、b、c)
分析(供您参考)
#profiling.py
导入pstats、cProfile
将numpy作为np导入
输入np_检验
导入np\u测试\u py
a=np.ones(2000年)
b=np.ones(2000年)
c=新成员(2000)*2
cProfile.runctx(“np_test.test(a,b,c)”,globals(),locals(),“Profile.prof”)
#crofile.runctx(“np_test_py.test(a,b,c)”,globals(),locals(),“Profile.prof”)
s=pstats.Stats(“Profile.prof”)
s、 strip_dirs().sort_stats(“时间”).print_stats()
setup.py(供您参考)
来自distutils.core导入设置,扩展
从Cython.Build导入cythonize
进口numpy
设置(
ext_modules=cythonize(“np_test.pyx”),
include_dirs=[numpy.get_include()]
)
python分析输出(0.32s)
ncalls tottime percall cumtime percall文件名:lineno(函数)
150000 0.297 0.000 0.297 0.000 np_测试py.py:6(测试助手)
1 0.023 0.023 0.320 0.320 np_试验。py:10(试验)
1 0.000 0.000 0.320 0.320{内置方法builtins.exec}
1    0.000    0.000    0.320    0.320 :1()                                                              
1 0.000 0.000 0.000 0.000{方法'disable'的''lsprof.Profiler'对象}
cython分析输出(0.666s)
ncalls tottime percall cumtime percall文件名:lineno(函数)
1 0.666 0.666 0.666 0.666{np_test.test}
1 0.000 0.000 0.666 0.666{内置方法builtins.exec}
1    0.000    0.000    0.666    0.666 :1()                                                              
1 0.000 0.000 0.000 0.000{方法'disable'的''lsprof.Profiler'对象}
Cython版本的速度实际上是python版本的一半。我认为反过来应该是可以实现的


谢谢

在您的
cython
代码中,您正在创建一个
0
的显式数组,即每个元素都被初始化。如果
numpy
加法代码会麻烦初始化结果数组,我会非常惊讶。尝试使用
np.empty
instead我对强制转换有点怀疑
-要么完全没有必要(因为结果已经是该数据类型),要么是为了隐藏错误(在这种情况下,您应该修复错误!)此外-评测可以显著改变您测量的计时:它有助于了解复杂程序中的时间花在哪里,但对于比较两个简单函数的速度,例如
timeit
要好得多。您是否尝试过使用更大的向量评测/计时?在我的笔记本电脑上,如果向量的大小是2000,就像你的例子一样,我还看到Cython的速度较慢。但是,当我将大小增加到20000或20000时,Cython实现优于numpy实现。@FlyingTeller使用
np.empty
确实快了一点,即0.666s->0.582s
   ncalls  tottime  percall  cumtime  percall filename:lineno(function)                                                        
1    0.666    0.666    0.666    0.666 {np_test.test}                                                                    
1    0.000    0.000    0.666    0.666 {built-in method builtins.exec}                                                   
1    0.000    0.000    0.666    0.666 <string>:1(<module>)                                                              
1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}