Python提高函数速度

2024-06-08 01:24:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写自己的脚本来计算两个信号之间的关系。因此我使用mlab.csd公司以及mlab.屏蔽门用于计算信号的CSD和PSD的函数。 我的数组x的形状是(120,68,68815)。我的脚本运行了几分钟,这个函数是这段时间的热点。你知道吗

有人知道我该怎么做吗?我不太熟悉脚本性能的提高。谢谢!你知道吗

# to read the list of stcs for all the epochs
with open('/home/daniel/Dropbox/F[...]', 'rb') as f:
    label_ts = pickle.load(f)

x = np.asarray(label_ts)
nfft = 512
n_freqs = nfft/2+1
n_epochs = len(x) # in this case there are 120 epochs
channels = 68
sfreq = 1017.25

def compute_mean_psd_csd(x, n_epochs, nfft, sfreq):
    '''Computes mean of PSD and CSD for signals.'''

    Rxy = np.zeros((n_epochs, channels, channels, n_freqs), dtype=complex)
    Rxx = np.zeros((n_epochs, channels, channels, n_freqs))
    Ryy = np.zeros((n_epochs, channels, channels, n_freqs))
    for i in xrange(0, n_epochs):
        print('computing connectivity for epoch %s'%(i+1))
        for j in xrange(0, channels):
            for k in xrange(0, channels):
                Rxy[i,j,k], freqs = mlab.csd(x[j], x[k], NFFT=nfft, Fs=sfreq)
                Rxx[i,j,k], _____ = mlab.psd(x[j], NFFT=nfft, Fs=sfreq)
                Ryy[i,j,k], _____ = mlab.psd(x[k], NFFT=nfft, Fs=sfreq)

    Rxy_mean = np.mean(Rxy, axis=0, dtype=np.float32)
    Rxx_mean = np.mean(Rxx, axis=0, dtype=np.float32)
    Ryy_mean = np.mean(Ryy, axis=0, dtype=np.float32)

    return freqs, Rxy, Rxy_mean, np.real(Rxx_mean), np.real(Ryy_mean)

Tags: in脚本fornpmeanepochschannelsdtype
1条回答
网友
1楼 · 发布于 2024-06-08 01:24:00

如果csdpsd方法是计算密集型的,那么这可能会有所帮助。有可能您可以简单地缓存以前调用的结果并获取它,而不是多次计算。你知道吗

看起来,您将有120 * 68 * 68 = 591872个循环。你知道吗

在psd计算的情况下,如果方法仅依赖于一个参数,则应该可以毫无问题地缓存值。你知道吗

将值存储在dict中,以便x[j]x[k]检查该值是否存在。如果值不存在,则计算并存储它。如果该值存在,只需跳过该值并重用该值。你知道吗

if x[j] not in cache_psd:
     cache_psd[x[j]], ____ = mlab.psd(x[j], NFFT=nfft, Fs=sfreq)
Rxx[i,j,k] = cache_psd[x[j]]

if x[k] not in cache_psd:
     cache_psd[x[k]], ____ = mlab.psd(x[k], NFFT=nfft, Fs=sfreq)
Ryy[i,j,k] = cache_psd[x[k]]

您可以使用csd方法执行相同的操作。我对这件事的了解还不够多。如果参数的顺序无关紧要,可以按排序顺序存储这两个参数,以防止重复,例如2, 11, 2。你知道吗

只有在内存访问时间低于计算时间和存储时间的情况下,使用缓存才能使代码更快。这个补丁可以很容易地添加一个模块,该模块执行memoization。你知道吗

以下是一篇关于回忆录的文章供进一步阅读:

http://www.python-course.eu/python3_memoization.php

相关问题 更多 >

    热门问题