在编写python代码时,我的典型工作流程是使用交互式提示并执行类似的操作
write function
repeat until working:
test function
edit function
Run Code Online (Sandbox Code Playgroud)
一旦我确定一切正常,我将以非交互模式运行代码并收集结果.
有时功能运行有点太慢,必须进行优化.
我对使用cython优化这些慢速函数感兴趣,但我希望保持我的交互式工作流程,即运行函数,进行更改,再次运行它们.
是否有捷径可寻?
到目前为止,我已经尝试将我的cython函数放在一个单独的模块"my_functions.pyx"中:
def fun1(int x):
return x + 130
def fun2(int x):
return x / 30
Run Code Online (Sandbox Code Playgroud)
然后运行(在交互式提示下)
import pyximport; pyximport.install()
import my_functions as mf
mf.fun1(25)
Run Code Online (Sandbox Code Playgroud)
这是第一次工作,但我想对我的cython函数进行更改并在同一个交互式会话中重新加载它们.
赛跑
import my_functions as mf
Run Code Online (Sandbox Code Playgroud)
根本不更新功能.跑步
reload(mf)
Run Code Online (Sandbox Code Playgroud)
给出错误:没有名为my_functions的模块
唯一有效的方法是退出当前会话,重新启动ipython,然后重新导入模块.但这种方式会破坏交互式运行的好处.
有没有更好的方法来交互式地优化cython的功能?
如果没有,你能描述一些其他方法来使用cython来优化代码吗?
任何帮助表示赞赏.
我知道一堆脚本语言,(python,ruby,lua,php),但我不知道任何编译语言,如C/C++,我想尝试使用cython加速一些python代码,这本质上是一个python - > C编译器,旨在为python创建C扩展.基本上你编写一个更严格的python版本编译成C - >本机代码.
这是问题所在,我不知道C,但是cython文档是针对那些显然已经知道C的人(没有解释,只提供),对我没有帮助,我需要知道是否有任何好处针对python程序员的cython教程,或者如果我在学习Cython之前必须学习C语言.
请记住,我是一名称职的python程序员,我宁愿从我已经擅长的语言的角度学习cython,而不是学习一门全新的语言来学习cython.
1)请不要推荐psyco
编辑:有助于理解官方cython文档的任何信息都是有用的信息
我正在使用一个C库,它重复调用用户提供的函数指针以获取更多数据.我想以这样的方式,Python实现该回调可以返回任何合理的数据类型写一个用Cython包装一样str,bytearray,内存映射文件等(具体而言,支持缓冲接口).到目前为止我所拥有的是:
from cpython.buffer cimport PyBUF_SIMPLE
from cpython.buffer cimport Py_buffer
from cpython.buffer cimport PyObject_GetBuffer
from cpython.buffer cimport PyBuffer_Release
from libc.string cimport memmove
cdef class _callback:
cdef public object callback
cdef public object data
cdef uint16_t GetDataCallback(void * userdata,
uint32_t wantlen, unsigned char * data,
uint32_t * gotlen):
cdef Py_buffer gotdata
box = <_callback> userdata
gotdata_object = box.callback(box.data, wantlen)
if not PyObject_CheckBuffer(gotdata_object):
# sulk
return 1
try:
PyObject_GetBuffer(gotdata_object, &gotdata, PyBUF_SIMPLE)
if not (0 < gotdata.len <= …Run Code Online (Sandbox Code Playgroud) 使用Cython,我正在开发一个扩展模块,它将构建为.so文件.然后我使用IPython测试它.在开发过程中,我经常需要进行更改和重建.我还需要退出IPython shell并重新输入所有命令.重新导入模块
import imp
imp.reload(Extension)
Run Code Online (Sandbox Code Playgroud)
不起作用,代码不更新.有没有办法让我在重建模块后避免重启IPython shell?
我正在尝试优化Reed-Solomon编码器,这实际上只是对Galois Fields 2 ^ 8的多项式除法运算(这意味着值环绕超过255).事实上,代码与Go中的代码非常相似:http://research.swtch.com/field
这里使用的多项式除法算法是合成除法(也称为Horner方法).
我尝试了一切:numpy,pypy,cython.我得到的最佳性能是使用pypy和这个简单的嵌套循环:
def rsenc(msg_in, nsym, gen):
'''Reed-Solomon encoding using polynomial division, better explained at http://research.swtch.com/field'''
msg_out = bytearray(msg_in) + bytearray(len(gen)-1)
lgen = bytearray([gf_log[gen[j]] for j in xrange(len(gen))])
for i in xrange(len(msg_in)):
coef = msg_out[i]
# coef = gf_mul(msg_out[i], gf_inverse(gen[0])) // for general polynomial division (when polynomials are non-monic), we need to compute: coef = msg_out[i] / gen[0]
if coef != 0: # coef 0 is normally undefined so we manage …Run Code Online (Sandbox Code Playgroud) TL.DR. 是否有三维友好实施theano.tensor.nnet.neighbours.images2neibs?
我想使用一个接收nxnxn图像的神经网络对体积(NxNxN)进行体素分类,其中N> n.为了对体积中的每个体素进行分类,我必须遍历每个体素.对于每次迭代,我获得并传递邻域体素作为神经网络的输入.这只是一个滑动窗口操作,其操作是神经网络.
虽然我的神经网络在Theano中实现,但滑动窗口实现是python/numpy.由于这不是纯粹的Theano操作,因此分类需要永久(> 3小时)来对一个体积中的所有体素进行分类.对于2d滑动窗口操作,Theano有一个辅助方法theano.tensor.nnet.neighbours.images2neibs,是否有类似的三维图像实现?
编辑:nd滑动窗口现有numpy解决方案(1和2),都使用np.lib.stride_tricks.as_strided来提供"滑动窗口的视图",从而防止内存问题.在我的实现中,滑动窗口数组从numpy(Cython)传递到Python然后传递到Theano.为了提高性能,我可能不得不绕过Python.
尝试在运行Ubuntu Server的小型VPS上安装Cython.难道
sudo apt-get install gcc
Run Code Online (Sandbox Code Playgroud)
然后
python setup.py install
Run Code Online (Sandbox Code Playgroud)
在Cython目录中,但我得到了这个特殊的错误.
running install
running build
running build_py
running build_ext
building 'Cython.Plex.Scanners' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.6 -c Cython/Plex/Scanners.c -o build/temp.linux-x86_64-2.6/Cython/Plex/Scanners.o
Cython/Plex/Scanners.c:4:20: error: Python.h: No such file or directory
Cython/Plex/Scanners.c:6:6: error: #error Python headers needed to compile C extensions, please install development version of Python.
error: command 'gcc' failed with exit status 1
Run Code Online (Sandbox Code Playgroud)
我为什么需要'Python的开发版'?运行Python 2.6.5(r265:79063,2010年4月16日,13:57:41).谢谢!
现在我已经在Windows 7上成功安装了Cython,我尝试使用Cython编译一些Cython代码,但是gcc让我的生活变得艰难.
cdef void say_hello(name):
print "Hello %s" % name
Run Code Online (Sandbox Code Playgroud)
使用gcc编译代码会引发许多未定义的 -erros 引用,我很确定它libpython.a是可用的(正如安装教程所说,如果缺少此文件,则会引发未定义的引用错误).
$ cython ctest.pyx
$ gcc ctest.c -I"C:\Python27\include"
Run Code Online (Sandbox Code Playgroud)
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1038): undefined reference to `_imp__PyString_FromStringAndSize'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1075): undefined reference to `_imp___Py_TrueStruct'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1086): undefined reference to `_imp___Py_ZeroStruct'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x1099): undefined reference to `_imp___Py_NoneStruct'
C:\Users\niklas\AppData\Local\Temp\cckThGrF.o:ctest.c:(.text+0x10b8): undefined reference to `_imp__PyObject_IsTrue'
c:/program files/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../libmingw32.a(main.o):main.c:(.text+0xd2): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
奇怪的是,使用pyximport*或setup-script工作得非常好,但是当它仍在处理模块时它们都不是很方便.
.c使用gcc 编译使用Cython生成的文件?或任何其他编译器,重要的是它会工作!
*pyximport:在导入的模块中只包含python-native函数和类而不包含cdef函数和类,这是正常的吗?喜欢:
# filename: cython_test.pyx
cdef c_foo(): …Run Code Online (Sandbox Code Playgroud) 我有一个C++类.它由一个.ccp文件和一个.h文件组成.它编译(我可以编写一个在c ++中成功使用它的main方法).如何使用Cython包装此类以使其在Python中可用?
我已经阅读了文档而没有关注.他们谈论生成cpp文件.当我试图关注文档时,我已经存在的cpp被吹走了......
我打算把什么放在pyx文件中?我被告知课程定义,但有多少?只是公共方法?
我需要一个.pxd文件吗?我不明白何时需要此文件.
我已经尝试在#python IRC频道中提出这些问题并且无法得到答案.
有没有办法告诉Cython编译器param是函数.就像是
cpdef float calc_class_re(list data, func callback)
Run Code Online (Sandbox Code Playgroud) cython ×10
python ×10
c ×2
gcc ×2
numpy ×2
optimization ×2
c++ ×1
callback ×1
compilation ×1
install ×1
ipython ×1
pep3118 ×1
pybuffer ×1
pypy ×1
python-2.7 ×1
python-3.x ×1
theano ×1