我怎样才能加快这个 Python 函数的速度?
How can I speed up this Python function?
有什么方法可以向量化这个表达式吗?
import numpy as np
def phase(f, dt=1):
c = [f[0]] + [fi*dt for fi in f[1:]]
s=0
x = []
for ci in c:
s = (s+ci)%(2*np.pi)
x.append(s)
return x
f
是任意长度的数组,dt
是常量。
代码执行:
- 将整个向量
f
但第一个实例乘以 dt
。
- return 部分和即
output[i] = sum(c[0:i])
模 2pi
.
知道如何加快速度吗?
谢谢!
只需要一个for循环。
import numpy as np
def phase(f, dt=1):
s = 0
x = []
if f:
s = (s + f[0]) % (2 * np.pi)
x.append(s)
for fi in f[1:]:
s = (s + fi * dt) % (2 * np.pi)
x.append(s)
return x
您可以使用 Numpy 的 cumsum()
函数以矢量化方式执行此操作。这应该会快很多:
import numpy as np
def phase(f, dt=1):
pi_2 = 2 * np.pi
c = np.concatenate((f[:1], f[1:] * dt))
return np.cumsum(c) % pi_2
时间安排:
n = np.arange(5000)
%timeit original_phase(n, 3)
# 3.2 ms ± 120 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit phase(n, 3)
# 272 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
np.testing.assert_allclose(original_phase(n, 3), phase(n, 3))
有什么方法可以向量化这个表达式吗?
import numpy as np
def phase(f, dt=1):
c = [f[0]] + [fi*dt for fi in f[1:]]
s=0
x = []
for ci in c:
s = (s+ci)%(2*np.pi)
x.append(s)
return x
f
是任意长度的数组,dt
是常量。
代码执行:
- 将整个向量
f
但第一个实例乘以dt
。 - return 部分和即
output[i] = sum(c[0:i])
模2pi
.
知道如何加快速度吗? 谢谢!
只需要一个for循环。
import numpy as np
def phase(f, dt=1):
s = 0
x = []
if f:
s = (s + f[0]) % (2 * np.pi)
x.append(s)
for fi in f[1:]:
s = (s + fi * dt) % (2 * np.pi)
x.append(s)
return x
您可以使用 Numpy 的 cumsum()
函数以矢量化方式执行此操作。这应该会快很多:
import numpy as np
def phase(f, dt=1):
pi_2 = 2 * np.pi
c = np.concatenate((f[:1], f[1:] * dt))
return np.cumsum(c) % pi_2
时间安排:
n = np.arange(5000)
%timeit original_phase(n, 3)
# 3.2 ms ± 120 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit phase(n, 3)
# 272 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
np.testing.assert_allclose(original_phase(n, 3), phase(n, 3))