在函数代码作为字符串的情况下,是否有一种简单的方法可以在运行时编译Cython函数?
我有一个参数化的子程序,例如
cdef algo(x, params)
params
在编译时不知道,但在开头就知道了(例如通过配置设置),并且在程序的整个生命周期内都是固定的; algo
可针对特定params
进行算法优化(优化超出编译器可执行的范围),但是,可能优化algo
的数量非常大。换句话说,有一个功能可以接收params
,并为这些algo
生成params
的快速实施代码:
def meta_algo(params):
<meta magic>
return code_of_super_fast_algo
问题是如何编译和导入meta_algo
的输出定义的函数?
假设您有一组固定的小字符串ys
。
对于给定的另一个字符串x
,您希望使用x
中的每个字符串计算ys
的最大公共前缀的长度,并将其作为整数数组返回。一个参考天真的实现:
def max_prefix(x, ys):
result = []
for i, y in enumerate(ys):
j = 0
while x[j] == y[j]:
j++
result[i] = j
return result
例如,如果知道ys
的字符串彼此严重相交,则可以轻松地计算比较树,但是使用任何树数据结构将引入不期望的开销。相反,可以在一系列if
中“内联”这个树结构并生成有效的代码。
对于ys = ['aaa', 'aab', 'baa']
,可能会得到:
cdef max_prefix(str x):
if x[0] == 'a':
if x[1] != 'a':
return [1, 1, 0]
if x[2] == 'a':
return [3, 2, 0]
elif x[2] == 'b':
return [2, 3, 0]
else:
return [2, 2, 0]
elif ...:
...
答案 0 :(得分:0)
在深入了解Cython的内容之后,我发现了以下池请求:
https://github.com/cython/cython/pull/555
提供我想要的功能:
code = """
cpdef int plus(int a, int b):
return a + b
"""
module = cython_inline_module(code)
plus = getattr(module, 'plus')
assert plus(1, 2) == 3