跨音速运行python代码,而不是pythran

2024-05-16 10:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在pythran取得第一个好成绩之后,我尝试了跨音速从jit和类支持中获益。不幸的是,它没有按预期运行。
如果我使用@jitdecorator,修饰后的函数将被编译和缓存,但是在代码的第一次运行期间,不会使用编译后的版本,而是由python处理该函数。第一次运行后,将使用缓存版本。
如果我使用@boostdecorator并运行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的二手软件:
跨音速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)

Tags: 函数代码inpy版本nparrayjit
1条回答
网友
1楼 · 发布于 2024-05-16 10:23:01

您的问题是由于跨音速中的一个旧错误造成的(现在由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[]"):
    ...

相关问题 更多 >