我在纯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有更快的方法吗?谢谢!
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)时间.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |