【发布时间】:2023-03-09 11:30:01
【问题描述】:
我有 cython 代码用于加速原本纯 python 计算中的瓶颈。我在长度为 Lbox 的周期框中有一对点(对于这个问题,1d 情况很好)。我需要计算 y-x 的符号,当周期性边界条件有效时,我需要翻转这个符号。
在没有 PBC 的情况下,以下问题提供了解决方案:Is there a standard sign function (signum, sgn) in C/C++?。该解决方案就是我用来计算 sgn 函数的方法。
def sgn(x, y):
""" If x > y, returns 1.
If x < y, returns -1.
If x == y, returns 0.
"""
return (y < x) - (x < y)
下面写的sgn_pbc函数返回正确的结果,但是写的效率低:sgn_pbc中的控制流是导致PBC版本变慢的罪魁祸首。我怎样才能以类似于 sgn 函数的方式编写 sgn_pbc,从而避免笨拙的控制流程?
def sgn_pbc(x, y, Lbox):
d = abs(x-y)
if d <= Lbox/2.:
return sgn(x, y)
else:
return -1*sgn(x, y)
【问题讨论】:
-
在
sgn,你为什么不用np.sign(y-x)? -
对于一对浮点数,上面的sgn函数比np.sign快400%左右
-
你用
numpy标记了这个。通常加快速度的最佳方法是对代码进行矢量化,这就是 numpy 的全部意义所在。您是否对矢量化解决方案感兴趣,其中x和y是浮点数组,还是要坚持使用“浮点对”? -
这些是
python还是cython函数?我看到了def,但没有看到cdef?
标签: python performance numpy cython