标签: cython

如何使用pyximport以交互方式重新加载cython模块

在编写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 optimization cython

22
推荐指数
1
解决办法
3563
查看次数

Noob-Ready 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

21
推荐指数
2
解决办法
8503
查看次数

在Cython中使用缓冲区API

我正在使用一个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)

python memory-management cython pybuffer pep3118

21
推荐指数
1
解决办法
2096
查看次数

从IPython重新加载Python扩展模块

使用Cython,我正在开发一个扩展模块,它将构建为.so文件.然后我使用IPython测试它.在开发过程中,我经常需要进行更改和重建.我还需要退出IPython shell并重新输入所有命令.重新导入模块

import imp
imp.reload(Extension)
Run Code Online (Sandbox Code Playgroud)

不起作用,代码不更新.有没有办法让我在重建模块后避免重启IPython shell?

python ipython cython python-3.x

21
推荐指数
1
解决办法
3632
查看次数

优化reed-solomon编码器(多项式除法)

我正在尝试优化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)

python optimization pypy numpy cython

21
推荐指数
3
解决办法
1788
查看次数

在Theano的3D推拉窗口操作?

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解决方案(12),都使用np.lib.stride_tricks.as_strided来提供"滑动窗口的视图",从而防止内存问题.在我的实现中,滑动窗口数组从numpy(Cython)传递到Python然后传递到Theano.为了提高性能,我可能不得不绕过Python.

python numpy cython theano conv-neural-network

21
推荐指数
1
解决办法
766
查看次数

Cython安装GCC错误

尝试在运行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).谢谢!

python gcc install cython

20
推荐指数
1
解决办法
2万
查看次数

如何使用gcc从Cython编译.c代码

现在我已经在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 python gcc compilation cython

20
推荐指数
1
解决办法
2万
查看次数

如何用Cython包装C++类?

我有一个C++类.它由一个.ccp文件和一个.h文件组成.它编译(我可以编写一个在c ++中成功使用它的main方法).如何使用Cython包装此类以使其在Python中可用?

我已经阅读了文档而没有关注.他们谈论生成cpp文件.当我试图关注文档时,我已经存在的cpp被吹走了......

我打算把什么放在pyx文件中?我被告知课程定义,但有多少?只是公共方法?

我需要一个.pxd文件吗?我不明白何时需要此文件.

我已经尝试在#python IRC频道中提出这些问题并且无法得到答案.

c++ python cython python-2.7

20
推荐指数
2
解决办法
1万
查看次数

在Cython中有任何类型的功能吗?

有没有办法告诉Cython编译器param是函数.就像是

  cpdef float calc_class_re(list data, func callback)
Run Code Online (Sandbox Code Playgroud)

python callback cython

20
推荐指数
1
解决办法
4967
查看次数