Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Cython函数的运行时生成和编译 简短的版本_Python_Metaprogramming_Cython - Fatal编程技术网

Python Cython函数的运行时生成和编译 简短的版本

Python Cython函数的运行时生成和编译 简短的版本,python,metaprogramming,cython,Python,Metaprogramming,Cython,如果Cython函数的代码是字符串,那么有没有一种简单的方法可以在运行时编译该函数? 详细地 我有一个参数化的子程序 cdef algo(x, params) 该算法执行相对较少的操作,但调用非常频繁 参数在编译时是未知的,但在开始时是已知的(例如通过配置设置),并且在程序的整个生命周期内是固定的 algoo可以针对特定的params进行算法优化(优化超出了编译器的能力),但是,可能优化的algoo数量非常多 换句话说,有一个函数接收params,并为这些params生成快速实现algo的

如果Cython函数的代码是字符串,那么有没有一种简单的方法可以在运行时编译该函数?

详细地 我有一个参数化的子程序

cdef algo(x, params)
  • 该算法执行相对较少的操作,但调用非常频繁
  • 参数
    在编译时是未知的,但在开始时是已知的(例如通过配置设置),并且在程序的整个生命周期内是固定的
  • algoo
    可以针对特定的
    params
    进行算法优化(优化超出了编译器的能力),但是,可能优化的
    algoo
    数量非常多
换句话说,有一个函数接收
params
,并为这些
params
生成快速实现
algo
的代码:

def meta_algo(params):
  <meta magic>
  return code_of_super_fast_algo
例如,如果已知
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的内脏后,我发现了以下池请求:

提供了我想要的确切功能:

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

您的
Cython.inline
几乎可以满足您的需求,但它不会生成
cdef
函数。该PR仍然没有合并。。事实上,该公司于2016年开业,因此不太可能很快合并。你找到了核心赛昂的替代品了吗?
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