首页 > 解决方案 > Transonic 运行 python 代码而不是 pythran

问题描述

在使用 pythran 取得第一个好结果之后,我尝试了 transonic 以从 jit 和类支持中受益。不幸的是,它没有按预期运行。
如果我使用@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'>

重新运行transonic runmwe.py只会产生代码已经是最新的警告。

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

使用 conda-forge 的软件: transonic
0.4.5
pythran 0.9.7
python 3.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)

标签: pythonpythran

解决方案


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

您使用#transonic def looping(float[])(在 # 和跨音速之间没有空格)并且它仅在 # 之后的空格(来自https://www.python.org/dev/peps/pep-0008/#block-comments:“每一行块注释以 # 和一个空格开头")。

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

但是,Transonic 支持类型注释,避免注释中的签名并编写以下代码会更好:

from transonic import boost

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

推荐阅读