linux根目录cdef,关于linux:Cython:从python调用的cdef函数中调用扩展类型cdef方法...
我正在尝试编写一个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方法...相关推荐
- C++回调函数中调用Python函数出现的死锁问题调试及解决
一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...
- 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用
粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...
- python权重是什么意思_在python带权重的列表中随机取值的方法
1 random.choice python random模块的choice方法随机选择某个元素 foo = ['a', 'b', 'c', 'd', 'e'] from random import ...
- python中静态变量和静态方法_python类和函数中使用静态变量的方法
本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossib ...
- python定义一个int_python中定义int类型的方法
python中定义int类型的方法 发布时间:2020-07-27 11:40:21 来源:亿速云 阅读:106 作者:清晨 这篇文章主要介绍python中定义int类型的方法,文中介绍的非常详细,具 ...
- 【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
文章目录 前言 一.Linux 中调用 Groovy 脚本 二.Windows 中调用 Groovy 脚本 前言 在 命令行 , Groovy 脚本 , Groovy 类 , Java 类中 , 可以 ...
- shell 调用matlab,在matlab中调用linux命令 以及后台运行matlab --zz
由于matlab和linux命令各有所长:matlab比较擅长数值计算,linux命令比较擅长文件操作(matlab也基本上能够完成,但会稍微麻烦一点).所以在很多时候会需要将二者结合起来. 可能更多 ...
- python安装oracle驱动_python安装oracle扩展及数据库连接方法
python安装oracle扩展及数据库连接方法 这篇文章主要介绍了 python 安装 oracle 扩展及数据库连接方法, 较为详细的分析了 Python 下载 oracle 扩展及 Window ...
- python调用node_node-python:在nodejs中调用python代码
在npmjs.com中有一个包node-python,顾名思义,是不是就是在node中使用python呢?让我们往下看: (这里是它的地址:https://www.npmjs.com/package/ ...
最新文章
- MySql数据库查询结果用表格输出PHP代码示例
- [CodeForces1110C]Meaningless Operations
- python小白逆袭大神课程心得_python小白逆袭大神(深度学习7日训练营)——心得体会...
- 学习GNU Make (2): 规则
- 免费查题合集大推荐,付费根本不存在的!
- 事务的四个属性ACID
- c语言按键中断程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
- 加密和解密盐的使用_码农吐糟面试官:居然问我md5是对称加密还是非对称,故意的吧?...
- 四面快手归来,分享Java真题及面经:策略模式+红黑树+Java锁+Redis+Kafka等分布式
- 查看浏览器保存的密码
- js处理时间戳为各种格式/js判断公历/农历/周历节日和节气
- git commit后回退方法
- [NOI2017]蔬菜
- UCI数据集整理(论文常用数据集)
- android adb 抓取log
- 动词17【続】【長】【永】【存】
- win11下安装Cuda和Cudnn,保姆及教程!!!
- Python学习笔记——字典
- Python生成带圆角图片的二维码
- 【ONE·Data || 基础数据结构相关练习(一)】
热门文章
- pb 哪里找到系统图标_建议收藏的7个高质量图标网站,一网打尽图标素材
- 微信大改版,更新前必看的4个东西
- 动态文本_(302期)【动态】|| 立足相同文本,描绘不同风景 ——工作室开展“同课异构”活动...
- php log日志管理,PHP日志LOG类定义与用法示例
- cwntos使用不了php,centos系统不能使用yum命令怎么解决
- 云栖社区 mysql_mysql
- 用animation制作走马灯
- Test on 01/19/2019
- setInterval()与setTimeout()计时器
- 作为技术人为什么想创业