gpt4 book ai didi

python - Cython 函数的运行时生成和编译

转载 作者:行者123 更新时间:2023-12-01 09:31:25 25 4
gpt4 key购买 nike

简短版本

如果将函数代码作为字符串,是否有一种简单的方法可以在运行时编译 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 的最大公共(public)前缀的长度每个字符串来自 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 中。 s 并生成高效的代码。

对于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 ...:
...

最佳答案

在深入研究 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

关于python - Cython 函数的运行时生成和编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49941617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com