删除列表中条目的最有效方法

NGX*_*XII 1 python iteration optimization performance

我有一个巨大的4D数据集,在整个4个变量传播,x_list,y_list,z_list,和i_list.每个都是N个标量的列表,X,Y和Z代表点在空间中的位置,我代表强度.

通过将强度设置为0,我已经有一个功能可以选择并标记可忽略的点(强度太低的那些)进行删除.但是,当我在我的200万点设置上运行时,删除过程需要数小时.

目前,我使用.pop(index)命令删除数据点,因为它非常干净.这是代码:

counter = 0
i = 0
for entry in i_list
    if (i_list[i] == 0):
        x_list.pop(i)
        y_list.pop(i)
        z_list.pop(i)
        i_list.pop(i)
        counter += 1
        print (counter, "points removed")
    else
        i += 1
Run Code Online (Sandbox Code Playgroud)

我怎样才能更有效地做到这一点?

Mar*_*ius 5

我认为为每个现有列表创建新的空列表会更快,如果是,则将项目附加到它们i_list[i] != 0.查看您正在进行的操作的时间复杂度,您将看到删除项目是O(n),而追加是O(1).目前你正在进行大量的O(n)删除,其中包含相当大的n,这将非常慢.

所以类似于:

new_x = []
new_y = []
new_y = []
new_i = []

for index in range(len(i_list)):
    if i_list[index] != 0:
        new_x.append(x_list[index])
        new_y.append(y_list[index])
        # Etc.
Run Code Online (Sandbox Code Playgroud)

更进一步,您应该查看numpy数组,其中子集化以查找i_list != 0非常快的项目集.