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[]"):
...
在使用 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[]"):
...