加速嵌套循环中的浮点计算(如果可能,使用 CUDA)
Accelerate float calculations in nested loops (with CUDA if possible)
是否可以在 Python 中加速以下嵌套循环(可能使用 CUDA 或并行进程)?附加到 outputList[i]
的元素的顺序无关紧要。
目前,代码需要很长时间才能完成。哪一部分减慢了代码?是append()
还是计算f = c*sin(i*pi/180) + (1/c)*cos(i*pi/180)
?
N = 640*480
outputList = [[] for i in range(N)]
def foo(a,b): # a, b are always integers
c = sqrt(a**2 + b**2)
for deg in range(360):
f = c*sin(deg*pi/180) + (1/c)*cos(deg*pi/180)
if (f<1):
outputList[a].append(f)
if __name__ == '__main__':
for x in range(N):
for y in range(60):
foo(x,y)
正如 talonmies 提到的,您的第一步应该是使用 numpy。
import math
import numpy as np
def foo(a, b):
c = math.hypot(a, b)
degs = np.arange(360, dtype='f8')
rads = np.deg2rad(degs)
fs = c * np.sin(rads) + (1/c)*np.cos(rads)
below1 = fs[fs < 1.]
outputList[a].extend(below1)
有更高级的方法来计算 sin + cos,但我暂时保持简单。此外,根据您的用例,将 outputList 更改为 2D numpy 数组或 1D numpy 数组列表
是否可以在 Python 中加速以下嵌套循环(可能使用 CUDA 或并行进程)?附加到 outputList[i]
的元素的顺序无关紧要。
目前,代码需要很长时间才能完成。哪一部分减慢了代码?是append()
还是计算f = c*sin(i*pi/180) + (1/c)*cos(i*pi/180)
?
N = 640*480
outputList = [[] for i in range(N)]
def foo(a,b): # a, b are always integers
c = sqrt(a**2 + b**2)
for deg in range(360):
f = c*sin(deg*pi/180) + (1/c)*cos(deg*pi/180)
if (f<1):
outputList[a].append(f)
if __name__ == '__main__':
for x in range(N):
for y in range(60):
foo(x,y)
正如 talonmies 提到的,您的第一步应该是使用 numpy。
import math
import numpy as np
def foo(a, b):
c = math.hypot(a, b)
degs = np.arange(360, dtype='f8')
rads = np.deg2rad(degs)
fs = c * np.sin(rads) + (1/c)*np.cos(rads)
below1 = fs[fs < 1.]
outputList[a].extend(below1)
有更高级的方法来计算 sin + cos,但我暂时保持简单。此外,根据您的用例,将 outputList 更改为 2D numpy 数组或 1D numpy 数组列表