使用numpy操作纯python列表

使用numpy操作纯python列表,python,list,numpy,Python,List,Numpy,我有几个纯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

我有几个纯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.])
但是,随着列表大小的增加,代码的性能会下降。使用numpy有没有更快的方法?
谢谢

NumPy数组不是最好的数据结构。 当您可以在一个漂亮的大数组上调用NumPy函数时,NumPy数组将大放异彩(性能方面)。当您需要逐项或逐行遍历数组时,它们的表现并不特别好,这似乎是您在代码中所做的


以下是一些其他建议:

线路

line[0] not in final_ids:
可以通过将
最终\u id
设置为
集合而不是
列表来加快速度。
,而测试列表中的成员身份是
O(n)


同样,将
nodesL
a
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.])  
如果对于每个
(x,y,z)
有多个
节点ID
添加:

for nid in nodeID:
    newNodesCoord.append([nid, nx, ny, 0.])


循环的双精度
具有时间复杂性
O(n*m)
其中
n=len(deformedCoord)
m=len(nodesL)
。如果将
nodesL
a
dict
,那么
If(x,y,z)in nodesL
O(1)
,因此上面的循环在
O(n)
时间内运行。

NumPy数组不是最好的数据结构。 当您可以在一个漂亮的大数组上调用NumPy函数时,NumPy数组将大放异彩(性能方面)。当您需要逐项或逐行遍历数组时,它们的表现并不特别好,这似乎是您在代码中所做的


以下是一些其他建议:

线路

line[0] not in final_ids:
可以通过将
最终\u id
设置为
集合而不是
列表来加快速度。
,而测试列表中的成员身份是
O(n)


同样,将
nodesL
a
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.])  
如果对于每个
(x,y,z)
有多个
节点ID
添加:

for nid in nodeID:
    newNodesCoord.append([nid, nx, ny, 0.])


循环的双精度
具有时间复杂性
O(n*m)
其中
n=len(deformedCoord)
m=len(nodesL)
。如果将
nodesL
a
dict
,那么
If(x,y,z)in nodesL
O(1)
,因此上面的循环在
O(n)
时间内运行。

是的。我不认为numpy数组逐项迭代实际上比列表迭代慢(虽然可能慢,但我从来没有计时过),但是另外,如果需要动态添加元素(即更改大小),numpy数组也不是很好。不是迭代本身让它慢,它是在循环中使用的Python代码(例如逐项操作每个值),这使得循环速度变慢。当人们编写这样的代码时,就不会利用NumPy的快速底层C/Fortran函数。这就是导致逐项/逐行代码变慢的原因。至少在我的经验中,每次我计时时,这样使用的NumPy数组都比普通Python代码慢。@jpcgandre:我更改了您的编辑,因为在可能的情况下,nodeID中nid的
优先于xrange(0,len(nodeID))
中的I。它可读性更高,编写时间更短,并且避免了较慢的
nodeID[i]
,有利于
nid
。是的。我不认为numpy数组逐项迭代实际上比列表迭代慢(虽然可能慢,但我从来没有计时过),但是另外,如果需要动态添加元素(即更改大小),numpy数组也不是很好。不是迭代本身让它慢,它是在循环中使用的Python代码(例如逐项操作每个值),这使得循环速度变慢。当人们编写这样的代码时,就不会利用NumPy的快速底层C/Fortran函数。这就是导致逐项/逐行代码变慢的原因。至少在我的经验中,每次我计时时,这样使用的NumPy数组都比普通Python代码慢。@jpcgandre:我更改了您的编辑,因为在可能的情况下,nodeID中nid的
优先于xrange(0,len(nodeID))
中的I。它可读性更高,编写时间更短,并且避免了较慢的
nodeID[i]
,有利于
nid