- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想并行执行 3 个函数,在 Cython 的 prange 循环中采用相同的输入。他们在相同的变量 TV
和 du
上添加值,并采用相同的变量。代码的目的是计算四个主要方向上像素的梯度,然后计算逐像素的总变化。
为此,我创建一个包含方法名称的列表并迭代该列表。我有这个代码:
cdef void TV_norm(float[:, :] ux, float[:, :] uy, float[:, :] output, float epsilon, float p) nogil:
cdef int M = ux.shape[0]
cdef int N = ux.shape[1]
cdef int i, j
cdef float inv_p = 1./p
cdef float eps = epsilon**p
with parallel(num_threads=64):
for i in prange(M, schedule="guided"):
for j in range(N):
output[i, j] += (abs(ux[i, j])** p + abs(uy[i, j])** p + eps) **inv_p
cdef void center_diff(float[:, :] u, float[:, :] TV, float[:, :] du, int di, int dj, float epsilon, float p):
ux = np.roll(u, (di, 0)) - u
uy = np.roll(u, (0, dj)) - u
TV_norm(ux, uy, TV, epsilon, p)
du -= ux + uy
cdef void i_diff(float[:, :] u, float[:, :] TV, float[:, :] du, int di, int dj, float epsilon, float p):
ux = u - np.roll(u, (-di, 0))
uy = np.roll(u, (-di, dj)) - np.roll(u, (-di, 0))
TV_norm(ux, uy, TV, epsilon, p)
du += ux
cdef void j_diff(float[:, :] u, float[:, :] TV, float[:, :] du, int di, int dj, float epsilon, float p):
ux = np.roll(u, (di, -dj)) - np.roll(u, (0, -dj))
uy = u - np.roll(u, (0, -dj))
TV_norm(ux, uy, TV, epsilon, p)
du += uy
cdef list divTV_dual(float[:, :] u, float epsilon=0, float p=1):
cdef np.ndarray[DTYPE_t, ndim=2] TV = np.zeros_like(u)
cdef np.ndarray[DTYPE_t, ndim=2] du = TV.copy()
cdef list shifts = [[1, 1],[-1, 1],[1,-1],[-1, -1]]
cdef list methods = [center_diff, i_diff, j_diff]
with nogil, parallel(num_threads=4):
for i in prange(4, schedule="static"):
with gil:
di = shifts[i][0]
dj = shifts[i][1]
for j in range(3):
methods[j](u, TV, du, di, dj, epsilon, p)
return [du, TV]
虽然它在纯 Python 中工作,但 Cython 在编译时失败:
/usr/local/lib/python3.5/dist-packages/IPython/core/interactiveshell.py in run_cell_magic(self, magic_name, line, cell)
2129 magic_arg_s = self.var_expand(line, stack_depth)
2130 with self.builtin_trap:
-> 2131 result = fn(magic_arg_s, cell)
2132 return result
2133
<decorator-gen-127> in cython(self, line, cell)
/usr/local/lib/python3.5/dist-packages/IPython/core/magic.py in <lambda>(f, *a, **k)
185 # but it's overkill for just that one bit of state.
186 def magic_deco(arg):
--> 187 call = lambda f, *a, **k: f(*a, **k)
188
189 if callable(arg):
/usr/local/lib/python3.5/dist-packages/Cython/Build/IpythonMagic.py in cython(self, line, cell)
289 build_extension.build_temp = os.path.dirname(pyx_file)
290 build_extension.build_lib = lib_dir
--> 291 build_extension.run()
292 self._code_cache[key] = module_name
293
/usr/lib/python3.5/distutils/command/build_ext.py in run(self)
336
337 # Now actually compile and link everything.
--> 338 self.build_extensions()
339
340 def check_extensions_list(self, extensions):
/usr/lib/python3.5/distutils/command/build_ext.py in build_extensions(self)
445 self._build_extensions_parallel()
446 else:
--> 447 self._build_extensions_serial()
448
449 def _build_extensions_parallel(self):
/usr/lib/python3.5/distutils/command/build_ext.py in _build_extensions_serial(self)
470 for ext in self.extensions:
471 with self._filter_build_errors(ext):
--> 472 self.build_extension(ext)
473
474 @contextlib.contextmanager
/usr/lib/python3.5/distutils/command/build_ext.py in build_extension(self, ext)
530 debug=self.debug,
531 extra_postargs=extra_args,
--> 532 depends=ext.depends)
533
534 # XXX outdated variable, kept here in case third-part code
/usr/lib/python3.5/distutils/ccompiler.py in compile(self, sources, output_dir, macros, include_dirs, debug, extra_preargs, extra_postargs, depends)
572 except KeyError:
573 continue
--> 574 self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
575
576 # Return *all* object filenames, not just the ones we just built.
/usr/lib/python3.5/distutils/unixccompiler.py in _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts)
118 extra_postargs)
119 except DistutilsExecError as msg:
--> 120 raise CompileError(msg)
121
122 def create_static_lib(self, objects, output_libname,
CompileError: command 'x86_64-linux-gnu-gcc' failed with exit status 1
有什么办法可以做到这一点吗?
<小时/>这个概念验证有效:
%%cython --compile-args=-O3 --compile-args=-ffast-math --compile-args=-fopenmp --link-args=-fopenmp
# cython: boundscheck=False
# cython: cdivision=True
# cython: wraparound=False
# cython: profile=True
cimport cython
from cython.parallel cimport parallel, prange
cdef foo(a):
print(a)
cdef bar(a):
print(a)
methods = [foo, bar]
cdef int i
with nogil, parallel():
for i in prange(2):
with gil:
methods[i]("a")
最佳答案
找到了...列表中调用的方法应该使用 cpdef
定义,而不是 cdef
。
我猜这是因为这些函数使用 numpy 类型和方法,所以它们需要暴露在 python 中。
关于python - 从 Cython 中的列表调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47245057/
c 不做边界检查。那么cython是如何检查是否编译成c的呢? %%cython --annotate cimport cython @cython.boundscheck(True) cpdef m
可以直接声明用于 Cython 构造函数? 据我了解,这是可能的: # Cython cdef int[3] li = [1, 2, 3] # C++ int[3] li = {1, 2, 3} 但
所以,如果你有一个头文件。 %%file test.h struct mystruct{ int i; int j; }; 然后你将它包装在 Cython 中: cdef extern fr
我正在构建一个独立于平台的 cython 项目,我想根据正在使用的编译器传递编译器参数。我可以猜测基于平台的编译器,或者假设它与用于 Python 的编译器相同,但不能保证匹配。通常我注入(injec
我使用诗歌构建我的 cython 包。我在所有函数和类中都有 NumPy 风格的文档字符串。我现在要做的是添加 Sphinx 自动文档并发布在 Read the Docs。 我已阅读此主题 How d
赛通 libcpp模块包含 priority_queue 的模板,这很好,除了一件事:我不能通过自定义比较器(或者,至少,我不知道如何)。 我需要这个,因为我需要 priority_queue做一个a
以下代码定义了一个简单的 Cython 函数(为方便起见,使用 Ipython 魔法)。 %load_ext cython %%cython def f(float x, float y=2):
我正在尝试使用 cython 进行复数计算。在示例代码中,我想计算复数的复指数函数。问题是我不知道如何将我的整数乘以虚数单位。python的虚数单位1.0j乘以cython执行时报错。 这是我的代码:
在这里停留在一些基本的 Cython 上 - 在 Cython 中定义字符串数组的规范且有效的方法是什么? 具体来说,我想定义一个定长常量数组char . (请注意,此时我不想引入 NumPy。) 在
是否有可能,如果是,如何确定 Cython 中整数数据类型的大小(以位为单位)? 我正在尝试做这样的事情,以获得整数大小: cdef WORD_BITS = 0 IF sizeof(unsigned
我只是想打印 cython 变量的地址,但我无法绕过错误消息: cdef int myvar print &myvar 抛出 Cannot convert 'int *' to Python obje
我有一个 C 头文件,它在宏中定义了一个函数。我需要从 Cython 调用它。有没有办法在 Cython 中使用宏并使其完全扩展?我已经有了 C 类型的参数。 我尝试像使用函数一样使用 cdef,我认
令人惊讶的是,我似乎找不到通过名称获取结构体元素的单个示例(无论是在网络上还是在 cython 示例中)。 所以我收到了一个指向 C 函数结构体的指针,并且想要一一访问这些元素并将它们重新打包到 py
我尝试围绕 C++ 库编写一个 Cython 包装器 http://primesieve.org/ 它包装了一个函数count。到目前为止,它可以正确安装 python setup.py instal
我正在尝试将 cython 模块 data.pyx 导入另一个 cython 模块 user.pyx。一切都编译得很好,但是当我尝试在 python 模块中调用 user.pyx 时,我收到错误“Im
更新:内存 View 获胜。Cython 使用类型化内存 View :0.0253449 特别感谢 lothario,他指出了几个关键的变化。 荒谬。当然现在的问题是,似乎不能对它们做太多算术(加法和
我有一个使用 memoryview 数组的 cython 模块,即... double[:,:] foo 我想使用多处理并行运行这个模块。但是我得到了错误: PicklingError: Can't
我正在尝试使用 Cython 加速 PEP 484 类型的 python 脚本。我想保持一些语义和可读性。 之前,我有一个 Flags = int def difference(f1: Flags,
这个问题已经有答案了: Collapse multiple submodules to one Cython extension (5 个回答) 已关闭 3 年前。 我在一个包中有多个 .py 文件
我已经能够在我的 .pyx 脚本上使用 cython 在 linux 上创建一个 .so 文件。我也可以成功地在我的 python 解释器上进行导入。 我的问题是如何在不使用 cython 的情况下将
我是一名优秀的程序员,十分优秀!