我是新手。我对它的基本理解是,你希望通过对数组应用操作来实现效率,因为这将for
循环移动到c代码中。我试图使下面的calc
函数更高效,因此通过使用切片和x1-x2
来应用这个原理。这删除了我最初在代码中的内部for
循环,并大大提高了性能。我还能做些什么来提高函数的效率吗?或者我需要用C来实现它吗?
import math
import numpy as np
import time
def calc(x, i, K, N):
r = np.empty(K)
r[0] = 0
for k in range(1, K):
o = math.floor((k + N) / 2)
x1 = x[i-o:i-o+N]
x2 = x[i-o+k:i-o+N+k]
s = np.square(x1-x2)
r[k] = np.sum(s)/len(s)
return r
input = np.arange(8, 10, 0.002) * np.sin(np.arange(0, 100, 0.1) * np.pi)
start_time = time.time()
output1 = calc(input, 500, 64, 448)
print(time.time()-start_time)
字符串
输出:
0.00018095970153808594
这是我的第一次尝试:
def calc(x, i, K, N):
r = np.zeros(K)
s = np.zeros(N)
for k in range(1, K):
o = math.floor((k + N) / 2)
for n in range(N):
s[n] = x[n - o + i] - x[n - o + i + k]
s = np.square(s)
r[k] = np.sum(s) / len(s)
return r
型
输出:
0.0051839351654052734
2条答案
按热度按时间kdfy810k1#
我找不到一种方法来加速你的calc函数,但是如果你以下面的方式导入你的库,所有的代码都会运行得更快:
字符串
但也许这不是你想要的。
gdrx4gfi2#
我能够通过基于
x
的滑动窗口视图创建x1
和x2
的数组来对代码进行向量化,使用np.lib.stride_tricks.sliding_window_view
进行计算。但是请记住,在速度和可读性之间总是有一个权衡。字符串
比较:
型
如果你要多次调用你的函数,使用numba可能是一个不错的选择。你可以将它应用到你原来的双循环中,它甚至比我上面的矢量化版本更快。最快的似乎是使用单
for
循环版本。型
时间安排:
型