我正在尝试编写一个Cython模块,该模块可计算成对距离,这是较大类的位置敏感哈希的一部分。我尝试不创建每种类型和每种距离度量的代码,而是尝试创建一个cdef函数,该函数采用从Metric继承的各种扩展类型:

cdef class Metric:

def __init__(self):

pass

cdef class Euclidean(Metric):

cdef numeric c_evaluate(self, numeric[:] x, numeric[:] y, int dims):

....

cdef numeric[:,:] pairwise(numeric[:] x, numeric[:] y, Metric func, bint symmetric):

...

dm[i,j] = func.c_evaluate(x,y,dims)

...

要从Python访问此函数:

def py_pairwise(numeric[:,:] x, numeric[:,:] y, str func, bint symmetric = 1, **kwargs):

cdef Metric mfunc = to_Metric(func, **kwargs)

return pairwise(x, y, mfunc, symmetric)

但是,我不断收到错误消息" c_distance。[Metric]对象没有属性'c_evaluate'"。我想知道c_evaluate方法是否不可访问,因为该类对象是通过python函数to_Metric在python代码中创建的,尽管我认为def和cdef函数应该能够在Cython模块内相互调用。如果我将c_evaluate更改为cpdef方法,则该方法有效,但是我不确定这是否通过允许cdef对象通过python传递到cython来解决问题,或者仅使用速度较慢的python方法来解决。有什么建议(我也不在家里的电脑上,所以我现在没有所有代码。以后会更新吗?)

编辑:错字不在原始函数中(可能还有其他):

ctypedef fused floating:

float

double

cdef class Euclidean(Metric):

cdef public floating c_evaluate(self, floating[:] x, floating[:] y, int dims):

cdef int i

cdef floating tmp, d = 0

for i in range(dims):

tmp = x[i]-y[i]

d += tmp*tmp

return sqrt(d)

#@cython.boundscheck(False)

#@cython.wraparound(False)

def py_pairwise(numeric[:,::1] x, numeric[:,::1] y,str metric, bint symmetric,**kwargs):

cdef Metric func = to_Metric(metric,**kwargs)

return pairwise(x,y,func,symmetric)

cdef numeric[:,::1] pairwise(numeric[:,::1] x,numeric[:,::1] y, Metric met, bint symmetric):#

cdef int n,m,k,i,j

n = x.shape[0]

m = y.shape[0]

dims = x.shape[1]

if numeric in floating:

mdtype = np.float

else:

mdtype = np.int

#mdtype = np.float

cdef numeric[:,::1] dm = (np.empty((n,m),dtype = mdtype)).fill(0)

if symmetric:

interval = lambda i,n,m: range(i+1,m)

else:

interval = lambda i,n,m: range(m)

for i in range(n):

for j in interval(i,n,m):

dm[i,j] = met.c_evaluate(x[i,:],y[j,:],dims)

return np.asarray(dm)

另外,to_Metric:

def to_Metric(str m, **kwargs):

if len(kwargs) == 0:

if m == 'euclidean':

met = Euclidean()

elif m in {'cos','cosine'}:

met = Cosine()

elif m in {'hamming','matching'}:

met = Hamming()

else:

raise ValueError('Unrecognized metric {}'.format('\''+m+'\''))

else:

if m in {'pnorm','p-norm'}:

met = Pnorm(kwargs['p'])

elif m == 'maximal':

met = Maximal(kwargs['m1'],kwargs['m2'],kwargs['sep'])

else:

raise ValueError('Unrecognized metric {}'.format('\''+m+'\''))

return met

这可能只是拼写错误吗?

问题是c_evaluate与类Euclidean关联,因此只能与已知类型为Euclidean的对象一起使用。 但是,在pairwise中,您将met的类型声明为Metric。

因为您将c_evaluate函数声明为cdef,所以只能在编译时找到它。 如果希望像标准Python函数一样在运行时找到c_evaluate,则应将其声明为def。

如果您需要在编译时找到该函数(这样可以更快地调用它),则应该使c_evaluate是Metric对象的函数,或者应该使pairwise仅采用Euclidean对象。

谢谢。 根据cython Wiki上的示例,我最初在Metric中有一个c_evaluate方法,返回值为0,但是在编译时出现诸如"错误:重复成员'__pyx_fuse_0c_evaluate'"之类的错误,由于无法覆盖扩展类型cdef而错误地得出了这一结论。 方法。 现在,我看到了在融合类型数值内为每种类型创建重复方法的问题。

请注意,链接到的示例使用cpdef而不是cdef

是的,但是我假定cdef函数的用法类似,因为cpdef只是一个def,而cdef组合为python对象,我是正确的。 在cdef方法中只有一个融合类型的bug尚未修复。 如果我将所有内容都键入为double,则效果很好。

linux根目录cdef,关于linux:Cython:从python调用的cdef函数中调用扩展类型cdef方法...相关推荐

  1. C++回调函数中调用Python函数出现的死锁问题调试及解决

    一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...

  2. 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用

    粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...

  3. python权重是什么意思_在python带权重的列表中随机取值的方法

    1 random.choice python random模块的choice方法随机选择某个元素 foo = ['a', 'b', 'c', 'd', 'e'] from random import ...

  4. python中静态变量和静态方法_python类和函数中使用静态变量的方法

    本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossib ...

  5. python定义一个int_python中定义int类型的方法

    python中定义int类型的方法 发布时间:2020-07-27 11:40:21 来源:亿速云 阅读:106 作者:清晨 这篇文章主要介绍python中定义int类型的方法,文中介绍的非常详细,具 ...

  6. 【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )

    文章目录 前言 一.Linux 中调用 Groovy 脚本 二.Windows 中调用 Groovy 脚本 前言 在 命令行 , Groovy 脚本 , Groovy 类 , Java 类中 , 可以 ...

  7. shell 调用matlab,在matlab中调用linux命令 以及后台运行matlab --zz

    由于matlab和linux命令各有所长:matlab比较擅长数值计算,linux命令比较擅长文件操作(matlab也基本上能够完成,但会稍微麻烦一点).所以在很多时候会需要将二者结合起来. 可能更多 ...

  8. python安装oracle驱动_python安装oracle扩展及数据库连接方法

    python安装oracle扩展及数据库连接方法 这篇文章主要介绍了 python 安装 oracle 扩展及数据库连接方法, 较为详细的分析了 Python 下载 oracle 扩展及 Window ...

  9. python调用node_node-python:在nodejs中调用python代码

    在npmjs.com中有一个包node-python,顾名思义,是不是就是在node中使用python呢?让我们往下看: (这里是它的地址:https://www.npmjs.com/package/ ...

最新文章

  1. MySql数据库查询结果用表格输出PHP代码示例
  2. [CodeForces1110C]Meaningless Operations
  3. python小白逆袭大神课程心得_python小白逆袭大神(深度学习7日训练营)——心得体会...
  4. 学习GNU Make (2): 规则
  5. 免费查题合集大推荐,付费根本不存在的!
  6. 事务的四个属性ACID
  7. c语言按键中断程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
  8. 加密和解密盐的使用_码农吐糟面试官:居然问我md5是对称加密还是非对称,故意的吧?...
  9. 四面快手归来,分享Java真题及面经:策略模式+红黑树+Java锁+Redis+Kafka等分布式
  10. 查看浏览器保存的密码
  11. js处理时间戳为各种格式/js判断公历/农历/周历节日和节气
  12. git commit后回退方法
  13. [NOI2017]蔬菜
  14. UCI数据集整理(论文常用数据集)
  15. android adb 抓取log
  16. 动词17【続】【長】【永】【存】
  17. win11下安装Cuda和Cudnn,保姆及教程!!!
  18. Python学习笔记——字典
  19. Python生成带圆角图片的二维码
  20. 【ONE·Data || 基础数据结构相关练习(一)】

热门文章

  1. pb 哪里找到系统图标_建议收藏的7个高质量图标网站,一网打尽图标素材
  2. 微信大改版,更新前必看的4个东西
  3. 动态文本_(302期)【动态】|| 立足相同文本,描绘不同风景 ——工作室开展“同课异构”活动...
  4. php log日志管理,PHP日志LOG类定义与用法示例
  5. cwntos使用不了php,centos系统不能使用yum命令怎么解决
  6. 云栖社区 mysql_mysql
  7. 用animation制作走马灯
  8. Test on 01/19/2019
  9. setInterval()与setTimeout()计时器
  10. 作为技术人为什么想创业