在Cython pxd文件中对现有Python函数的定义

问题描述 投票:1回答:1

我有一个在内部循环中调用的函数,所以我想使用Cython加快速度。

.pxd文件中添加类型提示会有所帮助,但是用一点C魔术代替实现会更有用,所以我尝试在pxd文件中定义该函数然后将其替换:

# test.py
import cython

def foo_():
    print('Hello world')

if not cython.compiled:
    foo = foo_
# test.pxd

# What I want:
# @cython.skipdefinition
# foo()


cdef inline void foo():
    print('Hello world from Cython')

而且,当然会失败:test.py:7:4: Assignment to non-lvalue 'foo',因为C不允许分配给函数。

是否有办法替换pxd文件中的现有Python函数?

python cython
1个回答
2
投票

至少有两个选择:

  1. 如果不需要在多个模块之间共享cdef功能,则可以将整个内容放在.py文件中,而不使用.pxd文件。 @cython.inline装饰器在这里为您提供帮助:

    import cython
    
    @cython.cfunc
    @cython.inline
    def foo():
        if cython.compiled:
            print("Hello world from Cython")
        else:
            print("Hello world")
    
  2. 如果do需要.pxd文件中的定义才能在多个模块之间共享它,那么您需要更改分配。将纯Python版本写入模块globals() dict中:

    # ... other code as you wrote it ...
    
    if not cython.compiled:
        globals()['foo'] = foo_
    

    从Cython的角度来看,这并不覆盖C名称,所以很好。

由于意图更明确,我尽可能选择选项1。

© www.soinside.com 2019 - 2024. All rights reserved.