使用numpy来操作纯python列表

jpc*_*dre 1 python numpy list

我在纯python中有几个代码部分,如:

[final_ids.append(list_item[0]) for list_item in newNodesCoord]
for line in nodes:
    if line[0] not in final_ids:
        newNodesCoord.append([line[0], 0., 0., 0.])

for i,row in enumerate(deformedCoord):
    x,y,z,nx,ny=row 
    for j, line in enumerate(nodesL):
        nodeID,x2,y2,z2=line
        if x==x2 and y==y2 and z==z2:
           newNodesCoord.append([nodeID, nx, ny, 0.])
Run Code Online (Sandbox Code Playgroud)

但是,随着列表的大小增加代码检测器的性能.使用numpy有更快的方法吗?谢谢!

unu*_*tbu 5

NumPy数组不是最好的数据结构.当你可以在一个漂亮的大数组上调用NumPy函数时,NumPy数组会闪耀(性能方面).当你需要逐项或逐行遍历数组时,它们并不是特别好,这就是你在代码中所做的.


以下是一些其他建议:

这条线

line[0] not in final_ids:
Run Code Online (Sandbox Code Playgroud)

可以通过制作final_ids一个set而不是一个而加速list. 测试集合中的成员资格是O(1),而测试列表中的成员资格是O(n).


同样,做nodesL一个dict映射(x,y,z)nodeID值.然后你可以使用:

for x, y, z, nx, ny in deformedCoord:
    if (x,y,z) in nodesL:
        nodeID = nodesL[x,y,z]
        newNodesCoord.append([nodeID, nx, ny, 0.])  
Run Code Online (Sandbox Code Playgroud)

如果每个(x,y,z)都有多个nodeID添加:

for nid in nodeID:
    newNodesCoord.append([nid, nx, ny, 0.])
Run Code Online (Sandbox Code Playgroud)

要么

newNodesCoord.extend([[nid, nx, ny, 0.] for nid in nodeID])
Run Code Online (Sandbox Code Playgroud)

你的双倍for-loop时间复杂O(n*m)在哪里n = len(deformedCoord)m = len(nodesL).如果你做nodesL一个dict,然后 if (x,y,z) in nodesL就是O(1),所以在上面运行的循环O(n)时间.