在使用pythran的第一个好结果之后,我尝试跨音速从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的一些配置,还是这是预期的行为,我使用跨音速的方式是错误的?
康达锻造公司使用的软件:
跨声速0.4.5
吡喃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)发布于 2021-02-09 11:10:49
您的问题是由于一个旧的错误跨音速(现在由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[]"):
...https://stackoverflow.com/questions/64857530
复制相似问题