使用numpy操作纯python列表
我有几个纯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
[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
adict
映射(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
adict
,那么If(x,y,z)in nodesL
是O(1)
,因此上面的循环在O(n)
时间内运行。NumPy数组不是最好的数据结构。
当您可以在一个漂亮的大数组上调用NumPy函数时,NumPy数组将大放异彩(性能方面)。当您需要逐项或逐行遍历数组时,它们的表现并不特别好,这似乎是您在代码中所做的
以下是一些其他建议:
线路
line[0] not in final_ids:
可以通过将最终\u id
设置为集合而不是列表来加快速度。
,而测试列表中的成员身份是O(n)
同样,将nodesL
adict
映射(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
adict
,那么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
。