【问题标题】:How to specify list and tuple type in cython如何在 cython 中指定列表和元组类型
【发布时间】:2019-12-13 17:08:21
【问题描述】:

我有一个简单的函数,它将节点之间的键列表转换为相邻节点的列表。输入是“整数元组列表”,输出是“整数列表列表”,例如

 input:  bonds     = [(1,2), (1,4)]
 output: neighbors = [[],[2,4],[1],[],[1]]

我可以做些什么来更精确地指定这些类型,以便 Cython 可以更好地优化它?函数如下所示:

def bonds2neighs( list bonds, int natom ):
    cdef:
        int  ii
        list neighbors = [ [] for ii in xrange(natom) ]
        int i,j
    for i,j in bonds: 
        neighbors[i].append(j)
        neighbors[j].append(i)
    return neighbors

【问题讨论】:

  • 虽然问题已明确说明,但请回复:编码风格,也许您想使用与“neighs”不同的词? neigh 是马发出的声音,它也听起来像“不”,一种说不的方式。不幸的是,我想不出邻居的好缩写,但我认为拼写“邻居”是可以的。另外,我们是否可以假设从 1 到 n 的所有整数都将被覆盖,没有间隙?

标签: python optimization types cython


【解决方案1】:

内置的 Python 类型 listtupledict 等不是通用的。它们是基本*PyObject 的容器。您不能指定诸如list[tuple[int, int]] 之类的类型,因为没有这样的东西。

Cython 对准泛型的唯一支持是 fused types。它们类似于模板和联合的混合,允许预先指定一组固定的可能类型。但是,它们不能与扩展类型一起使用,因此不允许创建通用容器。

目前不支持融合类型作为扩展的属性 类型。只能声明变量和函数/方法参数 融合类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2020-07-03
    相关资源
    最近更新 更多