在pythran取得第一个好成绩之后,我尝试了跨音速从jit和类支持中获益。不幸的是,它没有按预期运行。
如果我使用@jit
decorator,修饰后的函数将被编译和缓存,但是在代码的第一次运行期间,不会使用编译后的版本,而是由python处理该函数。第一次运行后,将使用缓存版本。
如果我使用@boost
decorator并运行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)
您的问题是由于跨音速中的一个旧错误造成的(现在由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支持类型注释,最好避免注释中的签名,并编写:
相关问题 更多 >
编程相关推荐