小编mds*_*ggs的帖子

使用Cython构建未知长度的1-d数组/列表/向量的最有效方法?或者这应该永远不会完成?

我有一个时间关键模型,我在Cython中写道.我的Cython扩展的主要功能有一个循环,根据Cython分析器(它显示黄色阴影的Python调用量),唯一的"黄色"部分是我正在附加到Python列表的地方.(我必须输出一个Python对象,因为我在Python脚本中调用我的Cython函数).这是我的函数的基本思想(其余的是多余的,我已经测试了这个函数的每个部分,并且追加操作是瓶颈):

from libc.math cimport log
def main(some args):
    cdef (some vars)

    cdef list OutputList = []

    # NB: all vars have declared types
    for x in range(t):
        (do some Cythonic stuff, some of which uses my cimport-ed log)
        if condition is True:
            OutputList.append(x) # this is the only 'yellow' line in my main loop.
    return OutputList # return Python object to Python script that calls main()
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道输出数组/列表/向量的长度(无论我最终使用什么).但是,我可以将它设置为52560,这就是我最终在其他Python代码中将其调整到最后.我想在没有设置输出数组长度的情况下获得主要的速度提升,但如果它阻止我,我会很乐意抛出这个希望.

我也试过在Cython中使用C++来使用C++数据结构(向量,队列等),但这样做会消除我很好地保存日志的能力.我在Cython文档/ wiki上看到你可以编写一个'shim'模块来在C++ Cython中使用pure-C函数,但我不知道如何做到这一点,我找不到任何关于如何去做的事情.

无论如何,我欢迎所有坚持我的问​​题的建议:

在Cython中构建未知大小的列表/数组/向量的最佳方法是什么?或者是否有一个明确的替代方案(例如使用已知长度的可迭代对象进行解决)会使我的未知长度问题变得无法解决?

更新

C++容器确实显示了超过项目分配的速度增加,并且项目分配确实显示速度增加而不是附加到列表和numpy数组.最好的方法是使用C++容器,同时还能够使用纯C函数...这可以防止减速不得超越libc.math以获得快速日志功能.

c python cython

10
推荐指数
2
解决办法
6846
查看次数

标签 统计

c ×1

cython ×1

python ×1