python - 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)
解决方案
您的问题是由于 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[]"):
...
推荐阅读
- azure - 我们如何将数据库从 Provisioned CosmosDB 迁移到无服务器 CosmosDB?
- javascript - styled.TouchableOpacity 组件中 props.style 的类型是什么?
- linux - Wifi 站带宽 160MHz / 80MHz 控制 (linux)
- php - 我想根据 if 块中提到的条件将查询分配给 $query 变量,但它给了我一个错误,即提供了 null
- html - 切换侧边栏时如何在导航栏中移动/动画文本值
- python - 在 QtextEditor 中更改块格式
- tcp - 如何在一次请求调用/RestAPI 中通过以太网 TCP/IP 堆栈接收大约 15KB 的大数据?
- axios - 带关系的 Strapi 发布请求
- java - 如何检查记录是否已存在-spring boot
- gradle - Faas-CLI 不断构建模板函数而不是我自己的代码