快速版: 如何在Cython中声明一个抽象类?目标是仅声明接口,以便其他类可以从中继承,必须没有此类的实现.
interface.pxd:
cdef class IModel:
cdef void do_smth(self)
Run Code Online (Sandbox Code Playgroud)
impl.pyx:
from interface cimport IModel
cdef class A(IModel):
cdef void do_smth(self):
pass
Run Code Online (Sandbox Code Playgroud)
一切都很好编译,但当我impl.so
在python中导入时,我得到以下内容:
ImportError: No module named interface
Run Code Online (Sandbox Code Playgroud)
显然这个方法不是真正的虚拟和python想要IModel
的实例
更多细节:
我有一个cython扩展类(cdef class Integrator
),它应该在任何实例上运行,实现IModel
接口.界面只是确保实例具有方法void get_dx(double[:] x, double[:] dx)
,以便集成商可以在每个集成步骤中调用它,以便集成模型.我们的想法是,可以在cython中实现不同的模型,然后以交互方式集成它们并在python脚本中绘制结果.像那样:
from integrator import Integrator # <-- pre-compiled .so extension
from models import Lorenz # <-- also pre-compiled one, which inherits
# from IModel
mod = Lorenz() …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个客户端,它将通过tcp接收[EEG]数据并将其写入环形缓冲区.我认为将缓冲区作为ctypes或numpy数组非常方便,因为它可以为这样的缓冲区的任何位置创建一个numpy"视图",并且可以读取/写入/处理数据而无需任何复制操作.或者一般来说这是一个坏主意?
但是,我没有看到如何以这种方式实现固定大小的循环缓冲区.假设我创建了一个在内存中连续的缓冲区对象.达到缓冲区末尾时写入数据的最佳方法是什么?
一种可能的方法是在写指针到达缓冲区数组的末尾时开始覆盖(已经过时的)字节.然而,在边界附近,在这种情况下,某些块(用于处理)的numpy视图无法创建(或者可以吗?),因为其中一些仍然可以位于缓冲区数组的末尾,而另一个已经在它的开始.我读过它是不可能创建这样的圆形切片.怎么解决这个?
UPD:谢谢大家的答案.如果有人也面临同样的问题,这是我得到的最终代码.
我正在尝试设置tern_for_vim插件,以便在JavaScript中具有良好的自动完成功能.在编辑".js"文件时,"Ctrl + X Ctrl + O"会提供很好的语义结果,然后选择"backbone.js"和其他库.但是,当我在HTML文件中编辑JS块时,这不起作用,我只看到基于缓冲区的标准完成.我无法弄清楚问题是什么.如何解决这个问题?
每当我groupByKey
在RDD上进行操作时,即使原始表非常大,例如2k分区和数千万行,它也会分成200个作业.
此外,操作似乎停留在最后两个需要很长时间才能计算的任务上.
为什么是200?如何增加它,它会有帮助吗?
我的程序使用matplotlib绘制了大量的行(~200k),这对于内存非常贪婪.在绘图之前,我通常有大约1.5G的可用内存.当我显示数字时,系统会在仍有大约600-800M的可用RAM时开始大量交换.例如,当创建一个巨大的numpy数组时,不会观察到这种行为,它只是瞬间获取所有可用内存.很容易弄清楚这是matplotlib还是系统问题.
我正在使用64位Arch Linux.
UPD:交换等级设置为10.尝试将其设置为0,正如DoctororDrive建议的那样,但同样的事情.但是,在使用交换之前,其他程序似乎可以填充几乎所有内存.