Pythonify一些简单的循环

2024-10-03 19:20:26 发布

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

目前,我正在开发一个巨大的测试套件,每个文件都要经过387072次测试,我需要测试269个文件。我用Python编写了所有的逻辑,它都做了它应该做的,但问题是它非常慢。在

我想我已经确定了代码中的主要瓶颈。基本上,这些瓶颈似乎源于我使用Python为循环编制C风格的索引。如果有人能帮助我更好地掌握Python,我将非常感激:

for i in range(len(mixed)):
    if (len(signal1Data.shape)>1):
        for row in range(signal1Data.shape[0]):
            if (i>=signal1Data[row,0] and i<=signal1Data[row,1]):
                signal1Indicator[i] = 1;
    else:
        if (i>=signal1Data[0] and i<=signal1Data[1]):
            signal1Indicator[i] = 1;

以及:

^{pr2}$

其中signal1数据如下所示:

0 5000
5100 6778
8000 9246
...
etc

基本上,我尝试混合两个信号,然后在索引介于signal1Data中的值之间时创建一个指示符。我怎样才能通过Python术加快速度?在

编辑:

混合持有我正在混合的最后信号。它看起来像:

混合=[-0.943263,-0.823721,-0.582382,-0.24921389,0.000。。。等等]

类似地,signal1只是另一个相同格式的信号。在

信号1数据定义特定事件发生的位置。在我的例子中,我感兴趣的事件发生在0到5000之间,然后又发生在5100和6778之间,等等。这些数字是信号中事件发生的样本索引。当这个循环出现时,signal1Data是一个2D整数数组(但有时它可以是1D,因为只有1个事件,我正在加载它)numpy.loadtxt文件). 在


Tags: and文件inforlenif信号事件
3条回答

对于第一个循环,可以通过使用切片来移除外部循环和if

for start, stop in np.atleast_2d(signal1Data):
    signal1Indicator[start:stop+1] = 1

我不确定你能不能把它完全矢量化。。如果可以的话,它可能既快又不太清晰,也不那么像Python。在

第二种方法很简单,也是通过切片:

^{pr2}$

我不完全确定您要做什么,但是您可以做一些类似的事情来根据数组的索引创建一个掩码。在

data = np.arange(20).reshape(2,10) 
i,j = np.meshgrid(*map(np.arange, data.shape), indexing='ij')
mask = (j > 2) & (j < 6)
#To get the values this mask defines, do this.
data[mask].reshape(data.shape[0],-1) 

我不认为有一个更惯用的代码会使它更快,但下面是一些您可以做的事情:

for循环

for i in range(len(mixed)):

只有当你想让我成为一个数字时才有意义,否则你可以用

^{pr2}$

item将连续获取存储在某个\u列表中的值。在

检查列表是否为空

if some_list:

空列表的计算结果为false,非空列表的计算结果为true。不必检查长度。在

相关问题 更多 >