sympy
库具有很酷的ufuncify()
方法,该方法将符号表达式转换为C代码,对其进行编译,然后输出调用该C方法的lambda
函数。
我做了这个简单的演示,demo.py
:
import sympy
from sympy.utilities.autowrap import ufuncify
import sys
N = int(sys.argv[1])
theta = []
values = []
for n in range(N):
theta.append(sympy.symbols('x%s' % n))
values.append(n)
summation = sum(theta)
f = ufuncify(theta, summation)
print f(*values)[0]
它适用于小型
N
:$ python demo.py 21
210.0
但是对于较大的
N
,我收到以下错误:$ python demo.py 22
追溯(最近一次通话):
在第13行的文件“ demo.py”中
f = ufuncify(θ,求和)
ufuncify中的文件“ /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,第485行
返回自动换行(C.Equality(y [i],f(* args)),** kwargs)
自动换行中的文件“ /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,第403行
返回code_wrapper.wrap_code(例程,helpers = helps)
第139行的文件“ /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,在wrap_code中
self._process_files(例程)
_process_files中的文件“ /opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/sympy/utilities/autowrap.py”,第158行
“” .join(command),e.output))
sympy.utilities.autowrap.CodeWrapError:执行命令时出错:f2py -m wrapper_module_0 -c wrapd_code_0.f90。命令输出为:
运行构建
运行config_cc
统一config_cc,config,build_clib,build_ext,构建命令--compiler选项
运行config_fc
统一config_fc,config,build_clib,build_ext,构建命令--fcompiler选项
运行build_src
build_src
建立扩展“ wrapper_module_0”源
f2py选项:[]
f2py:> /tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c
创建/ tmp / tmpKbJQuO
创建/tmp/tmpKbJQuO/src.linux-x86_64-2.7
正在读取fortran代码...
读取文件“ wrapped_code_0.f90”(格式:免费)
后期处理...
块:wrapper_module_0
阻止:自动功能
后处理(阶段2)...
构建模块...
正在构建模块“ wrapper_module_0” ...
构造包装函数“ autofunc” ...
y_15 = autofunc(x_16,x1,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x2,x20,x21,x3,x4,x5,x6,x7,x8,x9,[m_17 ])
将C / API模块“ wrapper_module_0”写入文件“ /tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c”
将'/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c'添加到源中。
向include_dirs添加'/tmp/tmpKbJQuO/src.linux-x86_64-2.7'。
复制/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.c-> /tmp/tmpKbJQuO/src.linux-x86_64-2.7
复制/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/f2py/src/fortranobject.h-> /tmp/tmpKbJQuO/src.linux-x86_64-2.7
build_src:构建npy-pkg配置文件
运行build_ext
自定义UnixCCompiler
使用build_ext自定义UnixCCompiler
定制Gnu95FCompiler
找到可执行文件/opt/user/x86_64/gcc-4.7.2/bin/gfortran
定制Gnu95FCompiler
使用build_ext自定义Gnu95FCompiler
建立'wrapper_module_0'扩展
编译C源代码
C编译器:gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC
创建/ tmp / tmpKbJQuO / tmp
创建/ tmp / tmpKbJQuO / tmp / tmpKbJQuO
创建/tmp/tmpKbJQuO/tmp/tmpKbJQuO/src.linux-x86_64-2.7
编译选项:'-I / tmp / tmpKbJQuO / src.linux-x86_64-2.7 -I / opt / user / x86_64 / Python-2.7.3 / lib / python2.7 / site-packages / numpy / core / include -I /opt/user/x86_64/Python-2.7.3/include/python2.7 -c'
gcc:/tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c
在/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1728:0中包含的文件中,
来自/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17,
来自/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:15,
来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.h:13,
来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c:18:
/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/npy_deprecated_api.h:11:2:警告:#warning“使用不赞成使用的NumPy API,请禁用通过#定义NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION“ [-Wcpp]
/tmp/tmpKbJQuO/src.linux-x86_64-2.7/wrapper_module_0module.c:111:12:警告:âpy_sizeâ已定义但未使用[-Wunused-function]
gcc:/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c
在/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1728:0中包含的文件中,
来自/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:17,
来自/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h:15,
来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.h:13,
来自/tmp/tmpKbJQuO/src.linux-x86_64-2.7/fortranobject.c:2:
/opt/user/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include/numpy/npy_deprecated_api.h:11:2:警告:#warning“使用不赞成使用的NumPy API,请禁用通过#定义NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION“ [-Wcpp]
编译Fortran源
Fortran f77编译器:/opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -ffixed-form -fno-second-underscore -fPIC -O3 -funroll-loops
Fortran f90编译器:/opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -fno-second-underscore -fPIC -O3 -funroll-loops
Fortran修复编译器:/opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -ffixed-form -fno-second-underscore -Wall -fno-second-underscore -fPIC -O3 -funroll-loops
编译选项:'-I / tmp / tmpKbJQuO / src.linux-x86_64-2.7 -I / opt / user / x86_64 / Python-2.7.3 / lib / python2.7 / site-packages / numpy / core / include -I /opt/user/x86_64/Python-2.7.3/include/python2.7 -c'
gfortran:f90:wrapped_code_0.f90
wrapd_code_0.f90:1.133:
4,x15,x16,x17,x18,x19,x2,x20,x21,x3,x4,x5,x6,x7,x8,x9,y_15
1个
警告:行在(1)处被截断
wrapd_code_0.f90:1.132:
14,x15,x16,x17,x18,x19,x2,x20,x21,x3,x4,x5,x6,x7,x8,x9,y_15
1个
错误:(1)的正式参数列表中出现意外垃圾
wrapd_code_0.f90:33.3:
结束子程序
1个
错误:期望(1)处的END PROGRAM语句
错误:“ wrapped_code_0.f90”中的文件意外结束
wrapd_code_0.f90:1.133:
4,x15,x16,x17,x18,x19,x2,x20,x21,x3,x4,x5,x6,x7,x8,x9,y_15
1个
警告:行在(1)处被截断
wrapd_code_0.f90:1.132:
14,x15,x16,x17,x18,x19,x2,x20,x21,x3,x4,x5,x6,x7,x8,x9,y_15
1个
错误:(1)的正式参数列表中出现意外垃圾
wrapd_code_0.f90:33.3:
结束子程序
1个
错误:期望(1)处的END PROGRAM语句
错误:“ wrapped_code_0.f90”中的文件意外结束
错误:命令“ /opt/user/x86_64/gcc-4.7.2/bin/gfortran -Wall -fno-second-underscore -fPIC -O3 -funroll-loops -I / tmp / tmpKbJQuO / src.linux-x86_64-2.7 -I / opt /用户/x86_64/Python-2.7.3/lib/python2.7/site-packages/numpy/core/include -I / opt / user / x86_64 / Python-2.7.3 / include / python2.7 -c -c wrapper_code_0.f90 -o /tmp/tmpKbJQuO/wrapped_code_0.o“失败,退出状态为1
我该如何工作?
最佳答案
我张贴在sympy邮件列表上并得到了回复。这是一个已知的错误,已在其开发分支中修复。解决方法如下:https://github.com/sympy/sympy/pull/7968
关于python - sympy ufuncify中的参数限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26044938/