Transonic 运行 python 代码而不是 pythran

Transonic run python code instead of pythran

在使用 pythran 取得第一个好结果后,我尝试使用 transonic 从 jit 和 class 支持中获益。不幸的是,它并没有像预期的那样运行。
如果我使用 @jit 装饰器,装饰函数会被编译和缓存,但在代码的第一个 运行 期间,未使用编译版本,而是函数由 python 处理。在第一个 运行 之后使用缓存版本。
如果我使用 @boost 装饰器和 运行 transonic runmwe.py,则会在 __pythran__ 文件夹中创建一个编译版本,但是 运行 将脚本与 python runmwe.py我收到以下警告,代码由 python.

处理
WARNING: Pythran file does not seem to be up-to-date:
<module '__pythran__.runmwe_920d6d0a5cd396436d463468328e997b' from '__pythran__/runmwe_920d6d0a5cd396436d463468328e997b.cpython-38-x86_64-linux-gnu.so'>

Re运行ning transonic runmwe.py 只是产生一个警告,表明代码已经是最新的。

我是否错过了一些正确使用 @jit@boost 的配置,或者这是预期的行为并且我以错误的方式使用 transonic?

conda-forge 中使用的软件:
跨音速 0.4.5
pythran 0.9.7
python3.8.6

MWE:

import numpy as np
from transonic import jit,boost

#transonic def looping(float[])

@boost
def looping(np_array):
    shape_x =np_array.shape[0]
    for x in range(shape_x):
                if np_array[x] < 0.5:
                    np_array[x] = 0
                else:
                    np_array[x] = 1
    return np_array

in_arr = np.random.rand(10**7)

looping(in_arr)

您的问题是由于 Transonic 中的一个旧错误(现已由 https://foss.heptapod.net/fluiddyn/transonic/-/merge_requests/88 修复)造成的。

您使用 #transonic def looping(float[])(# 和 transonic 之间没有 space)并且它仅在 # 之后的 space 上运行良好(来自 https://www.python.org/dev/peps/pep-0008/#block-comments:“每一行块注释以 # 和单个 space").

开头

解决问题的最简单方法是添加 space,即写成 # transonic def looping(float[])。顺便说一句,任何代码格式化程序(如 https://black.readthedocs.io)都会自动为您添加它。

但是,Transonic 支持类型注释,如果避免注释中的签名并写成:

会更好
from transonic import boost

@boost
def looping(np_array: "float[]"):
    ...